Sometimes we need to control socket behavior (such as modifying the buffer size). At this time, we need to learn socket options.
Int getsockopt (INT sockfd, int level, int optname, void * optval, socklen_t * optlen) <br/> int setsockopt (INT sockfd, int level, int optname, const void * optval, socklen_t * optlen)
Level specifies the level of the control socket. Three values can be obtained:
1) sol_socket: General socket options.
2) ipproto_ip: IP Option.
3) ipproto_tcp: TCP option.
Optname specifies the control method (option name), which is explained in detail below
Optval gets or sets socket options. Convert the Data Type of the Option name
Option Name Description Data Type
========================================================== ======================================
Sol_socket
------------------------------------------------------------------------
So_broadcast allows sending broadcast data int
So_debug allows int debugging
So_dontroute
So_error get socket error int
So_keepalive
So_linger delay disconnection struct linger
So_oobinline put out-of-band data into normal data stream int
So_rcvbuf receive buffer size int
So_sndbuf sending buffer size int
So_rcvlowat lower limit int of the receiving buffer
So_sndlowat lower limit int of the sending Buffer
So_rcvtimeo receiving timeout struct timeval
So_sndtimeo sending timeout struct timeval
So_reuseraddr allows reuse of the local address and port int
So_type: Obtain the socket type Int.
So_bsdcompat is compatible with the BSD system int
========================================================== ========================================
Ipproto_ip
--------------------------------------------------------------------------
Ip_hdrincl contains the IP header int in the data package.
Ip_optinos IP header option int
Ip_tos service type
Ip_ttl time int
========================================================== ========================================
Ippro_tcp
--------------------------------------------------------------------------
Tcp_maxseg maximum TCP Data Segment Size int
Tcp_nodelay does not use the Nagle algorithm int
========================================================== ======================================
For more information, see the source code:
//////////////////////////////////////// /// // <Br/> // socketoptionsrv. CPP <br/> // socket options -- set the buffer size (10 times larger) </P> <p> # include <iostream. h> <br/> # include <winsock2.h> </P> <p> # define buf_size64 <br/> # pragma comment (Lib, "ws2_32.lib ") </P> <p> int main (INT argc, char * argv []) <br/>{< br/> wsadatawsd; <br/> sockets; <br/> sockaddr_inservaddr; <br/> charbufrecv [buf_size]; <br/> charbufsend [B Uf_size]; </P> <p> // initialize the socket <br/> If (wsastartup (makeword (), & WSD )) <br/>{< br/> cout <"wsastartup failed! /N "<Endl; <br/> return 1; <br/>}< br/> // connection socket <br/> S = socket (af_inet, sock_dgram, 0); <br/> If (invalid_socket = s) <br/>{< br/> cout <"socket failed! /N "<Endl; <br/> wsacleanup (); <br/> return 1; <br/>}</P> <p> int nerrorcode; <br/> int nbuflen; <br/> int noptlen = sizeof (nbuflen ); </P> <p> // obtain the size of the data buffer accepted by the current socket S <br/> nerrorcode = getsockopt (S, sol_socket, so_rcvbuf, (char *) & nbuflen, & noptlen); <br/> If (socket_error = nerrorcode) <br/>{< br/> cout <"getsockopt failed! /N "<Endl; <br/> wsacleanup (); <br/> return 1; <br/>}</P> <p> // set the accept data buffer of the current socket s to 10 times that of the original <br/> nbuflen * = 10; <br/> nerrorcode = setsockopt (S, sol_socket, so_rcvbuf, (char *) & nbuflen, noptlen); <br/> If (socket_error = nerrorcode) <br/>{ <br/> cout <"setsockopt failed! /N "<Endl; <br/> wsacleanup (); <br/> return 1; <br/>}</P> <p> // check whether the accept buffer of socket S is set successfully <br/> int uinewrcvbuf; <br/> getsockopt (S, sol_socket, so_rcvbuf, (char *) & uinewrcvbuf, & noptlen); <br/> If (socket_error = nerrorcode | uinewrcvbuf! = Nbuflen) <br/>{< br/> cout <"The Buf isn't same from Recv. "<Endl; <br/> wsacleanup (); <br/> return 1; <br/>}</P> <p> // set server symptom <br/> servaddr. sin_family = af_inet; <br/> servaddr. sin_port = htons (5000); <br/> servaddr. sin_addr.s_addr = htonl (inaddr_any); </P> <p> // bind a socket <br/> If (BIND (S, (sockaddr *) & servaddr, sizeof (sockaddr )) = socket_error) <br/>{< br/> cout <"bind failed:" <wsagetlasterror () <Endl; <br/> Closesocket (s); <br/> wsacleanup (); <br/> return 1; <br/>}</P> <p> sockaddr_inclientaddr; <br/> intnclientlen; </P> <p> // data to be sent in the buffer <br/> zeromemory (bufrecv, buf_size); <br/> zeromemory (bufsend, buf_size); <br/> strcpy (bufsend, "Hello world! "); <Br/> nclientlen = sizeof (clientaddr); <br/> while (1) <br/> {<br/> // accept data from the client <br/> If (recvfrom (S, bufrecv, buf_size, 0, (sockaddr *) & clientaddr, & nclientlen) = socket_error) <br/>{< br/> cout <"Recv failed:" <wsagetlasterror () <Endl; <br/> closesocket (s); <br/> wsacleanup (); <br/> return 1; <br/>}< br/> cout <"Recv from client:" <bufrecv <Endl; </P> <p> // send data to the server <br/> If (sendto (S, bufsend, buf_size, 0, (sockaddr *) & clientaddr, nclientlen) = socket_error) <br/>{< br/> cout <"send to client failed:" <wsagetlasterror () <Endl; <br/> closesocket (s); <br/> wsacleanup (); <br/> return 1; <br/>}</P> <p> // close the socket and release resources <br/> closesocket (s ); <br/> wsacleanup (); <br/> return 0; <br/>}
//////////////////////////////////////// /// // <Br/> // socketoptionclient. CPP <br/> // socket options -- set the buffer size (10 times larger) </P> <p> # include <iostream. h> <br/> # include <winsock2.h> </P> <p> # define buf_size64 <br/> # pragma comment (Lib, "ws2_32.lib ") </P> <p> int main (INT argc, char * argv []) <br/>{< br/> wsadatawsd; <br/> sockets; <br/> sockaddr_inservaddr; <br/> charbufrecv [buf_size]; <br/> charbufsen D [buf_size]; </P> <p> // initialize the socket <br/> If (wsastartup (makeword (), & WSD )) <br/>{< br/> cout <"wsastartup failed! /N "<Endl; <br/> return 1; <br/>}</P> <p> // create a socket <br/> S = socket (af_inet, sock_dgram, 0); <br/> If (invalid_socket = s) <br/>{< br/> cout <"socket failed! /N "<Endl; <br/> wsacleanup (); <br/> return 1; <br/>}</P> <p> // data to be sent in the buffer <br/> zeromemory (bufsend, buf_size); <br/> zeromemory (bufrecv, buf_size); <br/> strcpy (bufsend, "Hello world! "); </P> <p> // set server options <br/> servaddr. sin_family = af_inet; <br/> servaddr. sin_addr.s_addr = inet_addr ("192.168.1.254"); <br/> servaddr. sin_port = htons (5000); </P> <p> int nserverlen = sizeof (servaddr); <br/> while (1) <br/> {<br/> // send data to the server <br/> If (sendto (S, bufsend, buf_size, 0, (sockaddr *) & servaddr, nserverlen) = socket_error) <br/>{< br/> cout <"sendto failed:" <wsagetlasterror () <Endl; <br/> closesocket (s ); <br/> wsacleanup (); <br/> return 1; <br/>}< br/> // receives data from the server <br/> If (recvfrom (S, bufrecv, buf_size, 0, (sockaddr *) & servaddr, & nserverlen) = socket_error) <br/>{< br/> cout <"Recv failed: "<wsagetlasterror () <Endl; <br/> closesocket (s); <br/> wsacleanup (); <br/> return 1; <br/>}< br/> cout <"Recv from server:" <bufrecv <Endl; <br/>}</P> <p> // close the socket and release resources <br/> closesocket (s); <br/> wsacleanup (); <br/> return 0; <br/>}
Program running effect:
Source code:
Http://download.csdn.net/source/1676947