diff --git a/include/exceptions/socket_error.h b/include/exceptions/socket_error.h
new file mode 100644
index 0000000000000000000000000000000000000000..91e8769c5d2ec1d62acea53eb945b7d71d227d4c
--- /dev/null
+++ b/include/exceptions/socket_error.h
@@ -0,0 +1,20 @@
+/* 
+ * File:   socket_error.h
+ * Author: Eckl Máté <ecklm94@gmail.com>
+ *
+ * Created on 2016. május 27., 10:30
+ */
+
+#include <string>
+#include <stdexcept>
+
+#ifndef SOCKET_ERROR_H
+#define SOCKET_ERROR_H
+
+class socket_error: public std::runtime_error
+{
+public:
+	explicit socket_error(const std::string& msg): std::runtime_error(msg) {}
+};
+
+#endif /* SOCKET_ERROR_H */
diff --git a/include/udp_socket_wp.h b/include/udp_socket_wp.h
index 35f957b394d201a194513374a3f1e2977a42072b..1e5b7b62f198ce05345eae6bbbb2f9e6e719cbbe 100644
--- a/include/udp_socket_wp.h
+++ b/include/udp_socket_wp.h
@@ -25,6 +25,7 @@ protected:
 	/**
 	 * Creates a socket and stores it's file descriptor to fd.
 	 * @param __domain The domain in which the socket should be created
+	 * @throws socket_error if something goes wrong.
 	 */
 	void create_socket(int __domain = -1);
 public:
@@ -33,7 +34,7 @@ public:
 	 * Creates a new SOCK_DGRAM socket in given domain.
 	 * @param __domain Address family of the socket
 	 */
-	explicit udp_socket_wp(int __domain) { create_socket(__domain); }
+	explicit udp_socket_wp(int __domain): fd(-1), domain(-1) { create_socket(__domain); }
 
 	/**
 	 * Sets the domain of the socket.
@@ -44,6 +45,7 @@ public:
 	/**
 	 * Wrapper for setsockopt() function.
 	 * @see setsockopt()
+	 * @throws socket_error if setsockopt fails
 	 */
 	void setsockopt_wp (int __level, int __optname,
 		       const void *__optval, socklen_t __optlen);
@@ -51,6 +53,7 @@ public:
 	/**
 	 * Wrapper for bind() function.
 	 * @see bind()
+	 * @throws socket_error if bind fails
 	 */
 	void bind_wp(const struct sockaddr *__addr, size_t __len);
 
@@ -64,6 +67,8 @@ public:
 	 * Wrapper for recvfrom() function. Reads from the socket to a UDP packet.
 	 * @see recvfrom()
 	 * @return The UDP packet read form the socket
+	 * @throw const char* exception if there is an error while receiving the packet.
+	 * It contains the cause of the error.
 	 */
 	udp_packet_wp recvfrom_wp(struct sockaddr *sender_address, socklen_t *sender_address_len);
 
diff --git a/main.cpp b/main.cpp
index fabae055bf431b53fddef9d15c143ca670c7a4cb..0431d4e54525a70d0354743b8115c6403e579398 100644
--- a/main.cpp
+++ b/main.cpp
@@ -20,6 +20,7 @@
 #include "include/logger.h"
 #include "include/IPC_US_communicator.h"
 #include "include/command.h"
+#include "include/exceptions/socket_error.h"
 
 #define COMM_SOCK_PATH "/var/run/ecklm-dns/"
 #define RUNNING_USER "dnsuser"
@@ -137,7 +138,7 @@ int main(int argc, char *argv[])
 			}
 			catch(const char*) {
 				log_on_demand(LOG_ERR, 
-						"Answer not received within timeout time. "
+						"Answer not received within timeout. "
 						"Server may have already been killed.");
 			}
 		}
@@ -164,7 +165,13 @@ int main(int argc, char *argv[])
 	server_address.sin6_addr = in6_addr_any;
 	server_address.sin6_port = htons(port);
 
-	server.init(general_sockaddr_wp((sockaddr *) &server_address, sizeof(server_address)));
+	try {
+		server.init(general_sockaddr_wp((sockaddr *) &server_address, sizeof(server_address)));
+	}
+	catch (socket_error err) {
+		log_on_demand(LOG_ERR, err.what());
+		exit(EXIT_FAILURE);
+	}
 	if(verbose)
 	{
 		static char addr[INET6_ADDRSTRLEN];
@@ -189,7 +196,7 @@ int main(int argc, char *argv[])
 			else
 				comm_link.send_data("nothing has happened");
 		}
-		catch(const char*) { }
+		catch(const char*) {}
 	}
 // ---------------- SERVE END -------------------------
 
diff --git a/src/IPC_US_communicator.cpp b/src/IPC_US_communicator.cpp
index 35973fe83d7626ddb67b04d995bd511ab9aa9f67..95bffef4114feed0b56be7f82d8eedf806366d4f 100644
--- a/src/IPC_US_communicator.cpp
+++ b/src/IPC_US_communicator.cpp
@@ -11,8 +11,18 @@
 #include <unistd.h>
 
 #include "../include/IPC_US_communicator.h"
+#include "../include/exceptions/socket_error.h"
+#include "../include/logger.h"
 
-IPC_US_communicator::IPC_US_communicator(std::string socket_path, const bool master): server(master), comm_sock(AF_UNIX) {
+extern logger log_on_demand;
+
+IPC_US_communicator::IPC_US_communicator(std::string socket_path, const bool master): server(master) {
+	try {
+		comm_sock.set_domain(AF_UNIX);
+	}
+	catch(socket_error err) {
+		log_on_demand(LOG_ERR, err.what());
+	}
 	std::string master_sock_path = socket_path + "master.sock";
 	std::string slave_sock_path = socket_path + "slave.sock";
 
@@ -26,14 +36,24 @@ IPC_US_communicator::IPC_US_communicator(std::string socket_path, const bool mas
 	this->controller_sockaddr.set_sockaddr((sockaddr*) &ipc, sizeof(ipc));
 
 	timeval timeout = { 5, 0 };
-	comm_sock.setsockopt_wp(SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
-	if(master)
-	{
-		comm_sock.bind_wp(server_sockaddr);
+	try {
+		comm_sock.setsockopt_wp(SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
 	}
-	else
-	{
-		comm_sock.bind_wp(controller_sockaddr);
+	catch(socket_error err) {
+		log_on_demand(LOG_ERR, "Setting timeout for comm_link socket failed: %s.", err.what());
+	}
+	try {
+		if(master)
+		{
+			comm_sock.bind_wp(server_sockaddr);
+		}
+		else
+		{
+			comm_sock.bind_wp(controller_sockaddr);
+		}
+	}
+	catch(socket_error err) {
+		log_on_demand(LOG_ERR, "bind: %s.", err.what());
 	}
 }
 
diff --git a/src/dns_message.cpp b/src/dns_message.cpp
index b7ccc7a682a7bc5e7e36d230209eea6b6bd52ce3..2899ef6684bf6279f75ca039db9d20f3aa14e6d3 100644
--- a/src/dns_message.cpp
+++ b/src/dns_message.cpp
@@ -89,7 +89,7 @@ void operator<<(udp_packet_wp &dst_packet, const dns_message_em &msg) {
 						   dns_additional_size;
 
 	if(MAX_UDP_PACKET_SIZE_BYTES < full_msg_size) {
-		// May throw some exception
+		// Elvileg nem fordulhat elő...
 		return;
 	}
 	
diff --git a/src/udp_packet_wp.cpp b/src/udp_packet_wp.cpp
index d0580026efde166cd3fa01e0f8fd4f29af6b3701..81e62f90457250520ac71c711de3ad183531c256 100644
--- a/src/udp_packet_wp.cpp
+++ b/src/udp_packet_wp.cpp
@@ -31,8 +31,7 @@ udp_packet_wp::~udp_packet_wp() {
 }
 
 void udp_packet_wp::set_buf_len(const ssize_t new_buf_len) {
-	if(new_buf_len>MAX_UDP_PACKET_SIZE_BYTES) {
-		// May throw some exception...
+	if(new_buf_len > MAX_UDP_PACKET_SIZE_BYTES) {
 		buf_len = MAX_UDP_PACKET_SIZE_BYTES;
 	}
 	else if(new_buf_len < 0)
diff --git a/src/udp_socket_wp.cpp b/src/udp_socket_wp.cpp
index 6d2e0fca5d04007e76f0dfd536084135087408f1..30c184a425d559dbc5fe6fc008ba4fab94616f55 100644
--- a/src/udp_socket_wp.cpp
+++ b/src/udp_socket_wp.cpp
@@ -6,35 +6,34 @@
 #include "../include/udp_socket_wp.h"
 #include "../include/dns_message.h"
 #include "../include/logger.h"
+#include "../include/exceptions/socket_error.h"
 
 extern logger log_on_demand;
 extern bool verbose;
 
 void udp_socket_wp::create_socket(int __domain) {
-	if(domain < 0 || fd < 0)
+	if(__domain < 0 || fd > 0)
 	{
-		// May throw some exception...
+		throw socket_error("Invalid domain or socket has already been initialized.");
 	}
 
 	if(__domain >= 0)
 		domain = __domain;
 	if((fd = socket(__domain, SOCK_DGRAM, 0)) < 0)
 	{
-		// May throw some exception...
+		throw socket_error(strerror(errno));
 	}
 }
 
 void udp_socket_wp::setsockopt_wp(int __level, int __optname, const void* __optval, socklen_t __optlen) {
 	if (setsockopt(fd, __level, __optname, __optval, __optlen) < 0) {
-		// May throw some exception
-		PERROR_ON_DEMAND("setsockopt");
+		throw socket_error(strerror(errno));
 	}
 }
 
 void udp_socket_wp::bind_wp(const struct sockaddr* __addr, size_t __len) {
 	if (bind(fd, __addr, __len) < 0) {
-		// May throw some exception
-		PERROR_ON_DEMAND("bind");
+		throw socket_error(strerror(errno));
 	}
 }