00001 /* 00002 Socket options example 00003 AUP2, Sec. 8.03 00004 00005 Copyright 2003 by Marc J. Rochkind. All rights reserved. 00006 May be copied only for purposes and under conditions described 00007 on the Web page www.basepath.com/aup/copyright.htm. 00008 00009 The Example Files are provided "as is," without any warranty; 00010 without even the implied warranty of merchantability or fitness 00011 for a particular purpose. The author and his publisher are not 00012 responsible for any damages, direct or incidental, resulting 00013 from the use or non-use of these Example Files. 00014 00015 The Example Files may contain defects, and some contain deliberate 00016 coding mistakes that were included for educational reasons. 00017 You are responsible for determining if and how the Example Files 00018 are to be used. 00019 00020 */ 00021 #include "defs.h" 00022 #ifdef SOLARIS 00023 #define __EXTENSIONS__ 00024 #endif 00025 #include <sys/socket.h> 00026 #undef __EXTENSIONS__ 00027 #include <netinet/in.h> 00028 #include <netinet/tcp.h> 00029 /*[show]*/ 00030 typedef enum {OT_INT, OT_LINGER, OT_TIMEVAL} OPT_TYPE; 00031 00032 static void show(int skt, int level, int option, const char *name, 00033 OPT_TYPE type) 00034 { 00035 socklen_t len; 00036 int n; 00037 struct linger lng; 00038 struct timeval tv; 00039 00040 switch (type) { 00041 case OT_INT: 00042 len = sizeof(n); 00043 if (getsockopt(skt, level, option, &n, &len) == -1) 00044 printf("%s FAILED (%s)\n", name, strerror(errno)); 00045 else 00046 printf("%s = %d\n", name, n); 00047 break; 00048 case OT_LINGER: 00049 len = sizeof(lng); 00050 if (getsockopt(skt, level, option, &lng, &len) == -1) 00051 printf("%s FAILED (%s)\n", name, strerror(errno)); 00052 else 00053 printf("%s = l_onoff: %d; l_linger: %d secs.\n", name, 00054 lng.l_onoff, lng.l_linger); 00055 break; 00056 case OT_TIMEVAL: 00057 len = sizeof(tv); 00058 if (getsockopt(skt, level, option, &tv, &len) == -1) 00059 printf("%s FAILED (%s)\n", name, strerror(errno)); 00060 else 00061 printf("%s = %ld secs.; %ld usecs.\n", name, 00062 (long)tv.tv_sec, (long)tv.tv_usec); 00063 } 00064 } 00065 00066 static void showall(int skt, const char *caption) 00067 { 00068 printf("\n%s\n", caption); 00069 show(skt, SOL_SOCKET, SO_ACCEPTCONN, "SO_ACCEPTCONN", OT_INT); 00070 show(skt, SOL_SOCKET, SO_BROADCAST, "SO_BROADCAST", OT_INT); 00071 show(skt, SOL_SOCKET, SO_DEBUG, "SO_DEBUG", OT_INT); 00072 show(skt, SOL_SOCKET, SO_DONTROUTE, "SO_DONTROUTE", OT_INT); 00073 show(skt, SOL_SOCKET, SO_ERROR, "SO_ERROR", OT_INT); 00074 show(skt, SOL_SOCKET, SO_KEEPALIVE, "SO_KEEPALIVE", OT_INT); 00075 show(skt, SOL_SOCKET, SO_LINGER, "SO_LINGER", OT_LINGER); 00076 show(skt, SOL_SOCKET, SO_OOBINLINE, "SO_OOBINLINE", OT_INT); 00077 show(skt, SOL_SOCKET, SO_RCVBUF, "SO_RCVBUF", OT_INT); 00078 show(skt, SOL_SOCKET, SO_RCVLOWAT, "SO_RCVLOWAT", OT_INT); 00079 show(skt, SOL_SOCKET, SO_RCVTIMEO, "SO_RCVTIMEO", OT_TIMEVAL); 00080 show(skt, SOL_SOCKET, SO_REUSEADDR, "SO_REUSEADDR", OT_INT); 00081 show(skt, SOL_SOCKET, SO_SNDBUF, "SO_SNDBUF", OT_INT); 00082 show(skt, SOL_SOCKET, SO_SNDLOWAT, "SO_SNDLOWAT", OT_INT); 00083 show(skt, SOL_SOCKET, SO_SNDTIMEO, "SO_SNDTIMEO", OT_TIMEVAL); 00084 show(skt, SOL_SOCKET, SO_TYPE, "SO_TYPE", OT_INT); 00085 /* 00086 show(skt, IPPROTO_TCP, TCP_NODELAY, "TCP_NODELAY", OT_INT); 00087 show(skt, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, "IPV6_MULTICAST_HOPS", 00088 OT_INT); 00089 show(skt, IPPROTO_IPV6, IPV6_MULTICAST_IF, "IPV6_MULTICAST_IF", 00090 OT_INT); 00091 show(skt, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, "IPV6_MULTICAST_LOOP", 00092 OT_INT); 00093 show(skt, IPPROTO_IPV6, IPV6_UNICAST_HOPS, "IPV6_UNICAST_HOPS", 00094 OT_INT); 00095 */ 00096 } 00097 00098 int main(void) 00099 { 00100 int skt; 00101 00102 ec_neg1( skt = socket(AF_INET, SOCK_STREAM, 0) ) 00103 showall(skt, "AF_INET SOCK_STREAM"); 00104 ec_neg1( close(skt) ) 00105 ec_neg1( skt = socket(AF_INET, SOCK_DGRAM, 0) ) 00106 showall(skt, "AF_INET SOCK_DGRAM"); 00107 ec_neg1( close(skt) ) 00108 /* 00109 ec_neg1( skt = socket(AF_INET6, SOCK_STREAM, 0) ) 00110 showall(skt, "AF_INET6 SOCK_STREAM"); 00111 ec_neg1( close(skt) ) 00112 */ 00113 exit(EXIT_SUCCESS); 00114 00115 EC_CLEANUP_BGN 00116 exit(EXIT_FAILURE); 00117 EC_CLEANUP_END 00118 } 00119 /*[]*/