15 #include "visiontransfer/networking.h" 16 #include "visiontransfer/exceptions.h" 27 void Networking::initNetworking() {
31 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
37 addrinfo* Networking::resolveAddress(
const char* address,
const char* service) {
39 memset(&hints, 0,
sizeof(hints));
40 hints.ai_family = AF_INET;
41 hints.ai_socktype = SOCK_STREAM;
43 hints.ai_protocol = 0;
45 addrinfo* addressInfo =
nullptr;
47 if(getaddrinfo(address, service, &hints, &addressInfo) != 0 || addressInfo ==
nullptr) {
52 if(addressInfo->ai_addrlen !=
sizeof(sockaddr_in)) {
59 SOCKET Networking::connectTcpSocket(
const addrinfo* address) {
60 SOCKET sock = ::socket(address->ai_family, address->ai_socktype,
61 address->ai_protocol);
62 if(sock == INVALID_SOCKET) {
67 if(connect(sock, address->ai_addr, static_cast<int>(address->ai_addrlen)) < 0) {
68 TransferException ex(
"Error connection to destination address: " +
string(strerror(errno)));
75 void Networking::setSocketTimeout(SOCKET socket,
int timeoutMillisec) {
77 unsigned int timeout = timeoutMillisec;
79 struct timeval timeout;
80 timeout.tv_sec = timeoutMillisec/1000;
81 timeout.tv_usec = timeoutMillisec*1000;
84 setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char*>(&timeout),
sizeof(timeout));
85 setsockopt(socket, SOL_SOCKET, SO_SNDTIMEO, reinterpret_cast<char*>(&timeout),
sizeof(timeout));
88 void Networking::closeSocket(SOCKET& socket) {
89 setSocketBlocking(socket,
false);
90 shutdown(socket, SHUT_WR);
94 for(
int i=0; i<3; i++) {
95 int received = recv(socket, buffer,
sizeof(buffer), 0);
102 socket = INVALID_SOCKET;
105 void Networking::setSocketBlocking(SOCKET socket,
bool blocking) {
107 unsigned long on = (blocking ? 0 : 1);
108 ioctlsocket(socket, FIONBIO, &on);
110 int flags = fcntl(socket, F_GETFL, 0);
113 flags &= ~O_NONBLOCK;
117 fcntl(socket, F_SETFL, flags);
122 void Networking::enableReuseAddress(SOCKET socket,
bool reuse) {
123 int enable = reuse ? 1 : 0;
124 setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char*>(&enable),
sizeof(
int));
127 void Networking::bindSocket(SOCKET socket,
const addrinfo* addressInfo) {
128 if (::bind(socket, addressInfo->ai_addr, static_cast<int>(addressInfo->ai_addrlen)) < 0) {
134 SOCKET Networking::acceptConnection(SOCKET socket, sockaddr_in& remoteAddress) {
135 socklen_t clientAddressLength =
sizeof(sockaddr_in);
137 SOCKET newSocket = accept(socket, reinterpret_cast<sockaddr *>(&remoteAddress),
138 &clientAddressLength);
140 if(clientAddressLength !=
sizeof(sockaddr_in)) {
144 if(newSocket == INVALID_SOCKET) {
145 if(errno == EWOULDBLOCK || errno == ETIMEDOUT) {
147 return INVALID_SOCKET;
Exception class that is used for all transfer exceptions.