Windows网络编程经验收集

 

setsockopt小结

  1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用
  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));
  5. 如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响
  程序的性能:
  int nZero=0;
  setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
  6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):
  int nZero=0;
  setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));
  7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:
  BOOL bBroadcast=TRUE;
  setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL));
  8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可
  以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的
  作用,在阻塞的函数调用中作用不大)
  BOOL bConditionalAccept=TRUE;
  setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)&bConditionalAccept,sizeof(BOOL));
  9.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们
  一般采取的措施是"从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体
  应用的要求(即让没发完的数据发送出去后在关闭socket)?
  struct linger {
   u_short l_onoff;
   u_short l_linger;
  };
  linger m_sLinger;
  m_sLinger.l_onoff=1;//(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)
  // 如果m_sLinger.l_onoff=0;则功能和2.)作用相同;
  m_sLinger.l_linger=5;//(容许逗留的时间为5秒)
  setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));
  Note:1.在设置了逗留延时,用于一个非阻塞的socket是作用不大的,最好不用;
   2.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER,或者设置l_onoff=0;
  10.还一个用的比较少的是在SDI或者是Dialog的程序中,可以记录socket的调试信息:
  (前不久做过这个函数的测试,调式信息可以保存,包括socket建立时候的参数,采用的
  具体协议,以及出错的代码都可以记录下来)
  BOOL bDebug=TRUE;
  setsockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL));
  11.附加:往往通过setsockopt()设置了缓冲区大小,但还不能满足数据的传输需求,
  我的习惯是自己写个处理网络缓冲的类,动态分配内存;下面我将这个类写出,希望对
  初学者有所帮助:
  //仿照String 改写而成

Code

 


有关网络开发的一些库


1. libnet
提供的接口函数主要实现和封装了数据包的构造和发送过程.
地址:http://libnet.sourceforge.net/

2. libdnet
为几个低级网络例程提供了一个简化的接口在,包括网络地址处理,内核arp(4) 和 route(4)表处理,防火墙,接口配置,以及原始以太网和IP数据包传输。
地址:http://libdnet.sourceforge.net/

3. libpcap
提供的接口函数主要实现和封装了与数据包截获有关的过程。
地址:http://www.tcpdump.org/

4. libicmp
相对较为简单,它封装的是ICMP数据包的主要处理过程(构造、发送、接收等)。
地址:http://www.securityfocus.com/data/tools/libicmp.tar.gz

5.libnids
提供的接口函数主要实现了开发网络入侵监测系统所必须的一些结构框架。
地址:http://libnids.sourceforge.net/

6. libevent
这个东西可真是个好东西,如果是ACE太庞大的话,libevent真可谓是麻雀虽小,五脏俱全,支持的高性能网络IO有:/dev/poll,
kqueue, select, poll和linux 2.6内核中最强的epoll,同时也支持realtime
signal,用这个东西同样也可以兼容WIN32平台,只不过可惜的是它并没有实现WIN32平台下效率最高的IOCP。
不过对于网络游戏的服务器来说,这个东西的确是个好东西,对跨平台的兼容十分到位。
地址:http://monkey.org/~provos/libevent/

7. winpcap
winpcap(windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能:
     1> 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据报;
     2> 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
     3> 在网络上发送原始的数据报;
     4> 收集网络通信过程中的统计信息。

     winpcap的主要功能在于独立于主机协议(如TCP-IP)而发送和接收原始数据报。也就是说,winpcap不能阻塞,过滤或控制其他应用程序数据报的发收,它仅仅只是监听共享网络上传送的数据报。因此,它不能用于QoS调度程序或个人防火墙。
地址:http://www.winpcap.org/

8. libdcap
The libdcap library provides a POSIX like open, create, read,
write and lseek functions to the dCache storage. In addition there are
some specific functions for setting debug level, getting error messages
and binding the library to a network interface.
地址:http://www-dcache.desy.de/manuals/libdcap.html

转载:http://blog.csdn.net/happyhell/archive/2008/09/24/2973448.aspx

posted @ 2009-11-21 15:59  辛勤耕耘  阅读(407)  评论(0编辑  收藏  举报