//------------------------------------------------------------------- // sockbufs.cpp // // This application demonstrates use of socket-level options to // obtain the current sizes for a TCP socket's data-buffers, as // well as to change the current sizes of those data-buffers. // // compile using: $ g++ sockbufs.cpp -o sockbufs // execute using: $ ./sockbufs // // programmer: ALLAN CRUSE // written on: 26 FEB 2009 //------------------------------------------------------------------- #include // for printf(), perror() #include // for exit() #include // for socket(), getsockopt(), etc int main( int argc, char **argv ) { // create a connection-oriented TCP-protocol socket int sock = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( sock < 0 ) { perror( "socket" ); exit(1); } // obtain the sizes for the socket's send and receive buffers int sendlen, recvlen; socklen_t slen = sizeof( int ); if ( getsockopt( sock, SOL_SOCKET, SO_SNDBUF, &sendlen, &slen ) < 0 ) { perror( "getsockopt SNDBUF" ); exit(1); } if ( getsockopt( sock, SOL_SOCKET, SO_RCVBUF, &recvlen, &slen ) < 0 ) { perror( "getsockopt SNDBUF" ); exit(1); } // display these initial buffer-sizes printf( "\n" ); printf( " initial size of socket send-buffer: %d bytes \n", sendlen ); printf( " initial size of socket recv-buffer: %d bytes \n", recvlen ); printf( "\n" ); // minimize these buffer-sizes sendlen = 1; if ( setsockopt( sock, SOL_SOCKET, SO_SNDBUF, &sendlen, slen ) < 0 ) { perror( "setsockopt SNDBUF" ); exit(1); } recvlen = 1; if ( setsockopt( sock, SOL_SOCKET, SO_RCVBUF, &recvlen, slen ) < 0 ) { perror( "setsockopt RCVBUF" ); exit(1); } if ( getsockopt( sock, SOL_SOCKET, SO_SNDBUF, &sendlen, &slen ) < 0 ) { perror( "getsockopt SNDBUF" ); exit(1); } if ( getsockopt( sock, SOL_SOCKET, SO_RCVBUF, &recvlen, &slen ) < 0 ) { perror( "getsockopt SNDBUF" ); exit(1); } // display these minimum buffer-sizes printf( "\n" ); printf( " minimum size of socket send-buffer: %d bytes \n", sendlen ); printf( " minimum size of socket recv-buffer: %d bytes \n", recvlen ); printf( "\n" ); }