diff options
Diffstat (limited to 'util/sock.h')
-rw-r--r-- | util/sock.h | 234 |
1 files changed, 127 insertions, 107 deletions
diff --git a/util/sock.h b/util/sock.h index b711662c26d..89ac5ed8f44 100644 --- a/util/sock.h +++ b/util/sock.h @@ -2,22 +2,22 @@ /** * Copyright (C) 2008 10gen Inc. -* +* * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. -* +* * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. -* +* * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #pragma once - + #include <stdio.h> #include <sstream> #include "goodies.h" @@ -26,13 +26,15 @@ //#include <winsock2.h> //#include <ws2tcpip.h> typedef int socklen_t; -inline int getLastError() { return WSAGetLastError(); } -inline void disableNagle(int sock) { - int x = 1; - if( setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *) &x, sizeof(x)) ) - cout << "ERROR: disableNagle failed" << endl; +inline int getLastError() { + return WSAGetLastError(); +} +inline void disableNagle(int sock) { + int x = 1; + if ( setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *) &x, sizeof(x)) ) + cout << "ERROR: disableNagle failed" << endl; } -inline void prebindOptions( int sock ){ +inline void prebindOptions( int sock ) { } #else #include <sys/socket.h> @@ -43,41 +45,45 @@ inline void prebindOptions( int sock ){ #include <arpa/inet.h> #include <errno.h> #include <netdb.h> -inline void closesocket(int s) { close(s); } +inline void closesocket(int s) { + close(s); +} const int INVALID_SOCKET = -1; typedef int SOCKET; //#define h_errno errno -inline int getLastError() { return errno; } -inline void disableNagle(int sock) { - int x = 1; +inline int getLastError() { + return errno; +} +inline void disableNagle(int sock) { + int x = 1; - #ifdef SOL_TCP - int level = SOL_TCP; - #else - int level = SOL_SOCKET; - #endif +#ifdef SOL_TCP + int level = SOL_TCP; +#else + int level = SOL_SOCKET; +#endif - if( setsockopt(sock, level, TCP_NODELAY, (char *) &x, sizeof(x)) ) - log() << "ERROR: disableNagle failed" << endl; + if ( setsockopt(sock, level, TCP_NODELAY, (char *) &x, sizeof(x)) ) + log() << "ERROR: disableNagle failed" << endl; } -inline void prebindOptions( int sock ){ - DEV log() << "doing prebind option" << endl; - int x = 1; - if ( setsockopt( sock , SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x)) < 0 ) - cout << "Failed to set socket opt, SO_REUSEADDR" << endl; +inline void prebindOptions( int sock ) { + DEV log() << "doing prebind option" << endl; + int x = 1; + if ( setsockopt( sock , SOL_SOCKET, SO_REUSEADDR, &x, sizeof(x)) < 0 ) + cout << "Failed to set socket opt, SO_REUSEADDR" << endl; } #endif -inline void setSockReceiveTimeout(int sock, int secs) { +inline void setSockReceiveTimeout(int sock, int secs) { // todo - finish - works? struct timeval tv; tv.tv_sec = 0;//secs; tv.tv_usec = 1000; int rc = setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &tv, sizeof(tv)); - if( rc ) { + if ( rc ) { cout << "ERROR: setsockopt RCVTIMEO failed rc:" << rc << " errno:" << getLastError() << " secs:" << secs << " sock:" << sock << endl; } } @@ -86,115 +92,129 @@ inline void setSockReceiveTimeout(int sock, int secs) { string hostbyname(const char *hostname); struct SockAddr { - SockAddr() { addressSize = sizeof(sockaddr_in); memset(&sa, 0, sizeof(sa)); } - SockAddr(int sourcePort); /* listener side */ - SockAddr(const char *ip, int port); /* EndPoint (remote) side, or if you want to specify which interface locally */ + SockAddr() { + addressSize = sizeof(sockaddr_in); + memset(&sa, 0, sizeof(sa)); + } + SockAddr(int sourcePort); /* listener side */ + SockAddr(const char *ip, int port); /* EndPoint (remote) side, or if you want to specify which interface locally */ - struct sockaddr_in sa; - socklen_t addressSize; + struct sockaddr_in sa; + socklen_t addressSize; - bool isLocalHost() const { + bool isLocalHost() const { #if defined(_WIN32) - return sa.sin_addr.S_un.S_addr == 0x100007f; + return sa.sin_addr.S_un.S_addr == 0x100007f; #else - return sa.sin_addr.s_addr == 0x100007f; + return sa.sin_addr.s_addr == 0x100007f; #endif - } - - string toString() { - stringstream out; - out << inet_ntoa(sa.sin_addr) << ':' - << sa.sin_port; - return out.str(); - } - - unsigned getPort() { return sa.sin_port; } - - bool operator==(const SockAddr& r) const { - return sa.sin_addr.s_addr == r.sa.sin_addr.s_addr && - sa.sin_port == r.sa.sin_port; - } - bool operator!=(const SockAddr& r) const { return !(*this == r); } - bool operator<(const SockAddr& r) const { - if( sa.sin_port >= r.sa.sin_port ) - return false; - return sa.sin_addr.s_addr < r.sa.sin_addr.s_addr; - } + } + + string toString() { + stringstream out; + out << inet_ntoa(sa.sin_addr) << ':' + << sa.sin_port; + return out.str(); + } + + unsigned getPort() { + return sa.sin_port; + } + + bool operator==(const SockAddr& r) const { + return sa.sin_addr.s_addr == r.sa.sin_addr.s_addr && + sa.sin_port == r.sa.sin_port; + } + bool operator!=(const SockAddr& r) const { + return !(*this == r); + } + bool operator<(const SockAddr& r) const { + if ( sa.sin_port >= r.sa.sin_port ) + return false; + return sa.sin_addr.s_addr < r.sa.sin_addr.s_addr; + } }; const int MaxMTU = 16384; class UDPConnection { public: - UDPConnection() { sock = 0; } - ~UDPConnection() { if( sock ) { closesocket(sock); sock = 0; } } - bool init(const SockAddr& myAddr); - int recvfrom(char *buf, int len, SockAddr& sender); - int sendto(char *buf, int len, const SockAddr& EndPoint); - int mtu(const SockAddr& sa) { - return sa.isLocalHost() ? 16384 : 1480; - } - - SOCKET sock; + UDPConnection() { + sock = 0; + } + ~UDPConnection() { + if ( sock ) { + closesocket(sock); + sock = 0; + } + } + bool init(const SockAddr& myAddr); + int recvfrom(char *buf, int len, SockAddr& sender); + int sendto(char *buf, int len, const SockAddr& EndPoint); + int mtu(const SockAddr& sa) { + return sa.isLocalHost() ? 16384 : 1480; + } + + SOCKET sock; }; inline int UDPConnection::recvfrom(char *buf, int len, SockAddr& sender) { - return ::recvfrom(sock, buf, len, 0, (sockaddr *) &sender.sa, &sender.addressSize); + return ::recvfrom(sock, buf, len, 0, (sockaddr *) &sender.sa, &sender.addressSize); } inline int UDPConnection::sendto(char *buf, int len, const SockAddr& EndPoint) { - if( 0 && rand() < (RAND_MAX>>4) ) { - cout << " NOTSENT "; - // cout << curTimeMillis() << " .TEST: NOT SENDING PACKET" << endl; - return 0; - } - return ::sendto(sock, buf, len, 0, (sockaddr *) &EndPoint.sa, EndPoint.addressSize); + if ( 0 && rand() < (RAND_MAX>>4) ) { + cout << " NOTSENT "; + // cout << curTimeMillis() << " .TEST: NOT SENDING PACKET" << endl; + return 0; + } + return ::sendto(sock, buf, len, 0, (sockaddr *) &EndPoint.sa, EndPoint.addressSize); } inline bool UDPConnection::init(const SockAddr& myAddr) { - sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if( sock == INVALID_SOCKET ) { - cout << "invalid socket? " << errno << endl; - return false; - } - //cout << sizeof(sockaddr_in) << ' ' << myAddr.addressSize << endl; - if( ::bind(sock, (sockaddr *) &myAddr.sa, myAddr.addressSize) != 0 ) { - cout << "udp init failed" << endl; - closesocket(sock); - sock = 0; - return false; - } - socklen_t optLen; - int rcvbuf; - if (getsockopt(sock, - SOL_SOCKET, - SO_RCVBUF, - (char*)&rcvbuf, - &optLen) != -1) - cout << "SO_RCVBUF:" << rcvbuf << endl; - return true; + sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + if ( sock == INVALID_SOCKET ) { + cout << "invalid socket? " << errno << endl; + return false; + } + //cout << sizeof(sockaddr_in) << ' ' << myAddr.addressSize << endl; + if ( ::bind(sock, (sockaddr *) &myAddr.sa, myAddr.addressSize) != 0 ) { + cout << "udp init failed" << endl; + closesocket(sock); + sock = 0; + return false; + } + socklen_t optLen; + int rcvbuf; + if (getsockopt(sock, + SOL_SOCKET, + SO_RCVBUF, + (char*)&rcvbuf, + &optLen) != -1) + cout << "SO_RCVBUF:" << rcvbuf << endl; + return true; } inline SockAddr::SockAddr(int sourcePort) { - memset(sa.sin_zero, 0, sizeof(sa.sin_zero)); - sa.sin_family = AF_INET; - sa.sin_port = htons(sourcePort); - sa.sin_addr.s_addr = htonl(INADDR_ANY); - addressSize = sizeof(sa); + memset(sa.sin_zero, 0, sizeof(sa.sin_zero)); + sa.sin_family = AF_INET; + sa.sin_port = htons(sourcePort); + sa.sin_addr.s_addr = htonl(INADDR_ANY); + addressSize = sizeof(sa); } inline SockAddr::SockAddr(const char *ip, int port) { - memset(sa.sin_zero, 0, sizeof(sa.sin_zero)); - sa.sin_family = AF_INET; - sa.sin_port = htons(port); - sa.sin_addr.s_addr = inet_addr(ip); - addressSize = sizeof(sa); + memset(sa.sin_zero, 0, sizeof(sa.sin_zero)); + sa.sin_family = AF_INET; + sa.sin_port = htons(port); + sa.sin_addr.s_addr = inet_addr(ip); + addressSize = sizeof(sa); } -inline string getHostName() { +inline string getHostName() { char buf[256]; int ec = gethostname(buf, 127); - if( ec || *buf == 0 ) { + if ( ec || *buf == 0 ) { log() << "can't get this server's hostname errno:" << ec << endl; return ""; } |