TcpComm::TcpComm(const char* ip, int port, int maxPackageSendSize, int maxPackageReceiveSize) : maxPackageSendSize(maxPackageSendSize), maxPackageReceiveSize(maxPackageReceiveSize) { address.sin_family = AF_INET; #ifdef __clang__ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wconversion" #endif address.sin_port = htons(static_cast<unsigned short>(port)); #ifdef __clang__ #pragma clang diagnostic pop #endif if(ip) // connect as client? address.sin_addr.s_addr = inet_addr(ip); else { createSocket = socket(AF_INET, SOCK_STREAM, 0); ASSERT(createSocket > 0); int val = 1; setsockopt(createSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&val, sizeof(val)); address.sin_addr.s_addr = INADDR_ANY; VERIFY(bind(createSocket, (sockaddr*)&address, sizeof(sockaddr_in)) == 0); VERIFY(listen(createSocket, SOMAXCONN) == 0); NON_BLOCK(createSocket); } checkConnection(); }
TcpComm::TcpComm(const char* ip, int port, int maxPackageSendSize, int maxPackageReceiveSize) : createSocket(0), transferSocket(0), overallBytesSent(0), overallBytesReceived(0), maxPackageSendSize(maxPackageSendSize), maxPackageReceiveSize(maxPackageReceiveSize), wasConnected(false) { address.sin_family = AF_INET; address.sin_port = htons(port); if(ip) // connect as client? address.sin_addr.s_addr = inet_addr(ip); else { createSocket = socket(AF_INET, SOCK_STREAM, 0); ASSERT(createSocket > 0); int val = 1; setsockopt(createSocket, SOL_SOCKET, SO_REUSEADDR, (char*) &val, sizeof(val)); address.sin_addr.s_addr = INADDR_ANY; VERIFY(bind(createSocket, (sockaddr*) &address, sizeof(sockaddr_in)) == 0); VERIFY(listen(createSocket, SOMAXCONN) == 0); NON_BLOCK(createSocket); } checkConnection(); }
bool TcpComm::checkConnection() { if(!connected()) { #ifndef WIN32 unsigned int addrlen = sizeof(sockaddr_in); #else int addrlen = sizeof(sockaddr_in); #endif if(createSocket) transferSocket = accept(createSocket, (sockaddr*) &address, &addrlen); else if(!wasConnected) { transferSocket = socket(AF_INET, SOCK_STREAM, 0); ASSERT(connected()); if(connect(transferSocket, (sockaddr*) &address, sizeof(sockaddr_in)) != 0) { CLOSE(transferSocket); transferSocket = 0; } } if(connected()) { wasConnected = true; NON_BLOCK(transferSocket); // switch socket to nonblocking #ifdef MACOSX int yes = 1; VERIFY(!setsockopt(transferSocket, SOL_SOCKET, SO_NOSIGPIPE, &yes, sizeof(yes))); #endif if(maxPackageSendSize) VERIFY(!setsockopt(transferSocket, SOL_SOCKET, SO_SNDBUF, (char*)&maxPackageSendSize, sizeof(maxPackageSendSize))); if(maxPackageReceiveSize) VERIFY(!setsockopt(transferSocket, SOL_SOCKET, SO_RCVBUF, (char*)&maxPackageReceiveSize, sizeof(maxPackageReceiveSize))); return true; } else return false; } else return true; }