tsockopt()函数

2014-11-05 13:15:06 · 作者: · 浏览: 44

  最近在看TCP通信方面,觉得setsockopt()函数很有用,就将它的用法总结了下:


  1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:


  BOOL bReuseaddr=TRUE;


  setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));


  2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:


  BOOL bDontLinger = FALSE;


  setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));


  3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:


  int nNetTimeout=1000;//1秒


  //发送时限


  setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));


  //接收时限


  setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));


  4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为 8688字节(约为8.5K);在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:


  // 接收缓冲区


  int nRecvBuf=32*1024;//设置为32K


  setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));


  //发送缓冲区


  int nSendBuf=32*1024;//设置为32K


  setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));