src/Socket.h
branchv_0
changeset 2 2665ab0bcf44
parent 1 d93ea7346b66
child 3 2b57c8683ffe
equal deleted inserted replaced
1:d93ea7346b66 2:2665ab0bcf44
    30 namespace socket {
    30 namespace socket {
    31 
    31 
    32 class Socket {
    32 class Socket {
    33 private:
    33 private:
    34 	const static size_t MSG_SIZE = 8192; // TODO: configurable/dynamic
    34 	const static size_t MSG_SIZE = 8192; // TODO: configurable/dynamic
       
    35 	int s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    35 
    36 
    36 public:
    37 public:
    37 
    38 
    38 	virtual ~Socket() {
    39 	Socket() {
    39 	}
    40 		s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    40 
       
    41 	std::string receive() {
       
    42 		char buffer[MSG_SIZE + 1];
       
    43 		memset(buffer, 0, MSG_SIZE + 1);
       
    44 
       
    45 		int s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
       
    46 
    41 
    47 		struct sockaddr_in a;
    42 		struct sockaddr_in a;
    48 		memset((char *) &a, 0, sizeof (a));
    43 		memset((char *) &a, 0, sizeof (a));
    49 		a.sin_family = AF_INET;
    44 		a.sin_family = AF_INET;
    50 		a.sin_addr.s_addr = inet_addr("127.0.0.1"); // TODO: use getaddrinfo() instead (because of error -1 = 255.255.255.255)
    45 		a.sin_addr.s_addr = inet_addr("127.0.0.1"); // TODO: use getaddrinfo() instead (because of error -1 = 255.255.255.255)
    51 		a.sin_port = htons(1234);
    46 		a.sin_port = htons(1234);
    52 		::bind(s, (sockaddr*) & a, sizeof (a));
    47 		::bind(s, (sockaddr*) & a, sizeof (a));
    53 
    48 
       
    49 		// int soBufferSize = 1024 * 1024;
       
    50 		// setsockopt(s, SOL_SOCKET, SO_RCVBUF, &soBufferSize, sizeof (soBufferSize));
       
    51 		// soBufferSize = 0;
       
    52 		// socklen_t soBufferSizeLength = sizeof (soBufferSize);
       
    53 
       
    54 		// std::cerr << "soBufferSize=" << soBufferSize << std::endl;
       
    55 		// getsockopt(s, SOL_SOCKET, SO_RCVBUF, &soBufferSize, &soBufferSizeLength);
       
    56 		// std::cerr << "soBufferSize=" << soBufferSize << " length=" << soBufferSizeLength << std::endl;
       
    57 	}
       
    58 
       
    59 	virtual ~Socket() {
       
    60 		close(s);
       
    61 	}
       
    62 
       
    63 	std::string receive() {
       
    64 		char buffer[MSG_SIZE + 1];
       
    65 		memset(buffer, 0, MSG_SIZE + 1);
       
    66 
    54 		struct sockaddr_in remoteAddress;
    67 		struct sockaddr_in remoteAddress;
    55 		memset((char *) &remoteAddress, 0, sizeof (remoteAddress));
    68 		memset((char *) &remoteAddress, 0, sizeof (remoteAddress));
    56 		socklen_t remoteAddressSize = sizeof(remoteAddress);
    69 		socklen_t remoteAddressSize = sizeof (remoteAddress);
    57 
    70 
    58 		ssize_t msgSize = recvfrom(s, buffer, sizeof (buffer), 0, (sockaddr*) & remoteAddress, &remoteAddressSize);
    71 		ssize_t msgSize = recvfrom(s, buffer, sizeof (buffer), 0, (sockaddr*) & remoteAddress, &remoteAddressSize);
    59 
    72 
    60 		close(s);
       
    61 
    73 
    62 		if (msgSize > sizeof (buffer))throw std::logic_error("Invalid Socket message size.");
    74 		if (msgSize > sizeof (buffer))throw std::logic_error("Invalid Socket message size.");
    63 		else if (msgSize >= 0) return std::string(buffer, msgSize);
    75 		else if (msgSize >= 0) return std::string(buffer, msgSize);
    64 		else throw std::logic_error("Unable to receive Socket message the socket; error: " + std::string(strerror(errno)));
    76 		else throw std::logic_error("Unable to receive Socket message the socket; error: " + std::string(strerror(errno)));
    65 	}
    77 	}