/* gcc -g -Wall -o ./test_get+setsockopt ./test_get+setsockopt.c */ #define _GNU_SOURCE #include #include #include #include #include #define TEST_GETSOCKOPT1 1 #define TEST_SETSOCKOPT1 1 #define TEST_GETSOCKOPT2 1 #define TEST_GETSOCKOPT3 1 #define TEST_SETSOCKOPT2 1 #define TEST_GETSOCKOPT4 1 #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) static int32_t set_sock_size_rcvbuf(int sockfd, int *max_msg_size) { unsigned int optval = 0; socklen_t optlen = sizeof(optval); error_t err = 0; #if TEST_GETSOCKOPT1 err = getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen); if (err) { printf ("set_sock_size_rcvbuf():getsockopt(SO_RCVBUF) failed: errno=%d (%s)\n", errno, strerror(errno)); printf ("set_sock_size_rcvbuf():getsockopt(SO_RCVBUF) failed: optval=%d, optlen=%d\n", optval, optlen); return err; } printf ("set_sock_size_rcvbuf():getsockopt(SO_RCVBUF): optval=%d, optlen=%d\n", optval, optlen); #endif #if TEST_SETSOCKOPT1 printf ("set_sock_size_rcvbuf(): Requested: *max_msg_size = %d\n", *max_msg_size); optval = *max_msg_size; optlen = sizeof(*max_msg_size); err = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &optval, optlen); if (err) { printf ("set_sock_size_rcvbuf():setsockopt(SO_RCVBUF) failed: errno=%d (%s)\n", errno, strerror(errno)); printf ("set_sock_size_rcvbuf():setsockopt(SO_RCVBUF) failed: optval=%d, *max_msg_size=%d\n", *max_msg_size, optlen); return err; } #ifdef __GNU__ printf ("set_sock_size_rcvbuf():setsockopt(SO_RCVBUF): GNU/Hurd: S_sock_setopt RPC is wrong: No return value\n"); #else printf ("set_sock_size_rcvbuf():setsockopt(SO_RCVBUF): optval=%d, optlen=%d\n", optval, optlen); printf ("set_sock_size_rcvbuf(): Returned: optval = %d\n", optval); #endif #endif #if TEST_GETSOCKOPT2 printf( "set_sock_size_rcvbuf: Checking set values\n"); err = getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &optval, &optlen); if (err) { printf ("set_sock_size_rcvbuf():getsockopt(SO_RCVBUF) failed: errno=%d (%s)\n", errno, strerror(errno)); printf ("set_sock_size_rcvbuf():getsockopt(SO_RCVBUF) failed: optval=%d, optlen=%d\n", optval, optlen); return err; } printf ("set_sock_size_rcvbuf():getsockopt(SO_RCVBUF): optval=%d, optlen=%d\n", optval, optlen); *max_msg_size = optval; #endif return err; } static int32_t set_sock_size_sndbuf(int sockfd, int *max_msg_size) { int32_t err; unsigned int optval = 0; socklen_t optlen = sizeof(optval); #if TEST_GETSOCKOPT3 err = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen); if (err) { printf ("set_sock_size_sndbuf():getsockopt(SO_SNDBUF) failed: errno=%d (%s)\n", errno, strerror(errno)); printf ("set_sock_size_sndbuf():getsockopt(SO_SNDBUF) failed: optval=%d, optlen=%d\n", optval, optlen); return err; } printf ("set_sock_size_sndbuf():getsockopt(SO_SNDBUF): optval=%d, optlen=%d\n", optval, optlen); #endif #if TEST_SETSOCKOPT2 optval = *max_msg_size; optlen = sizeof(*max_msg_size); printf ("set_sock_size_sndbuf(): Requested: *max_msg_size = %d\n", optval); err = setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &optval, optlen); if (err) { printf ("set_sock_size_sndbuf():setsockopt(SO_SNDBUF) failed: errno=%d (%s)\n", errno, strerror(errno)); printf ("set_sock_size_sndbuf():setsockopt(SO_SNDBUF) failed: optval=%d, *max_msg_size=%d\n", *max_msg_size, optlen); return err; } #ifdef __GNU__ printf ("set_sock_size_sndbuf():setsockopt(SO_SNDBUF): GNU/Hurd: S_sock_setopt RPC is wrong: No return value\n"); #else printf ("set_sock_size_sndbuf():setsockopt(SO_SNDBUF): optval=%d, optlen=%d\n", optval, optlen); printf ("set_sock_size_sndbuf(): Returned: optval = %d\n", optval); #endif #endif #if TEST_GETSOCKOPT4 printf( "set_sock_size_rsnduf: Checking set values\n"); err = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen); if (err) { printf ("set_sock_size_sndbuf():getsockopt(SO_SNDBUF) failed: errno=%d (%s)\n", errno, strerror(errno)); printf ("set_sock_size_sndbuf():getsockopt(SO_SNDBUF) failed: optval=%d, optlen=%d\n", optval, optlen); return err; } printf ("set_sock_size_sndbuf():getsockopt(SO_SNDBUF): optval=%d, optlen=%d\n", optval, optlen); #endif return err; } #include "./defs.inc" int main(void) { //int max_msg_size = 128*1024; /* 131072 = 128 kiB */; //int max_msg_size = 256*1024; /* 262144 = 256 kiB */ int max_msg_size = 20*1024; /* 20480 = 20 kiB */ /* Linux default: 208*1024 = 212992 */ /* Hurd default: libpipe/pipe.c write_limit = 16*1024 = 16384 */ int err = -1; #ifdef USE_SOCK_STREAM #define type SOCK_STREAM #else #define type SOCK_DGRAM #endif #ifdef USE_AF_UNIX #define domain AF_UNIX #else #define domain AF_INET #endif int sfd = socket(domain, type, 0); //int sfd = 5; if (sfd == -1) handle_error("socket"); printf("\ntest_get+setsockopt.c:main():\n"); printf ("domain = %s ", domain==AF_UNIX ? "AF_UNIX" : "AF_INET"); printf ("type = %s ", type==SOCK_DGRAM ? "SOCK_DGRAM" : "SOCK_STREAM"); printf("Socket sfd = %d\n", sfd); printf ("\nCASE: SO_RCVBUF\n"); printf ("main(): Requested: max_msg_size = %d\n", max_msg_size); err = set_sock_size_rcvbuf (sfd, &max_msg_size); if (err == -1) printf ("\nmain():set_sock_size_rcvbuf() failed: errno = %d (%s)\n", errno, strerror(errno)); else printf ("\nmain():set_sock_size_rcvbuf(): max_msg_size=%d\n", max_msg_size); printf( "\nCASE: SO_SNDBUF\n"); max_msg_size = 8*max_msg_size; printf ("main(): Requested: max_msg_size = %d\n", max_msg_size); err = set_sock_size_sndbuf (sfd, &max_msg_size); if (err == -1) printf ("\nmain():set_sock_size_sndbuf() failed: errno = %d (%s)\n", errno, strerror(errno)); else printf ("\nmain():set_sock_size_sndbuf(): max_msg_size=%d\n", max_msg_size); exit((err == 0) ? EXIT_SUCCESS : EXIT_FAILURE); }