©2004 by Marc J. Rochkind. All rights reserved. Portions marked "Open Source" may be copied under license.

 

Main Page   Modules   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

c8/sktopt.c

Go to the documentation of this file.
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 /*[]*/

Generated on Fri Apr 23 10:57:02 2004 for AUP2 Example Source by doxygen 1.3.1