文档详情

TCPIP Winsock网络编程综述.doc

发布:2016-04-05约4.5千字共6页下载文档
文本预览下载声明
 TCP/IP Winsock网络编程综述利用Winsock编程由同步和异步方式,同步方式逻辑清晰,编程专注于应用,在抢先式的多任务操作系统中(WinNt、Win2K)采用多线程方式效率基本达到异步方式的水平,应此以下为同步方式编程要点。   1、快速通信   Winsock的Nagle算法将降低小数据报的发送速度,而系统默认是使用Nagle算法,使用      int setsockopt(     SOCKET s,   int level,   int optname,   const char FAR *optval,   int optlen     );函数关闭它   例子:     SOCKET sConnect;   sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);   int bNodelay = 1;   int err;   err = setsockopt(   sConnect,   IPPROTO_TCP,   TCP_NODELAY,   (char *)amp;bNodelay,   sizoeof(bNodelay));//不采用延时算法      if (err != NO_ERROR)   TRACE (setsockopt failed for some reason\n);;   2、SOCKET的SegMentSize和收发缓冲   TCPSegMentSize是发送接受时单个数据报的最大长度,系统默认为1460,收发缓冲大小为8192。   在SOCK_STREAM方式下,如果单次发送数据超过1460,系统将分成多个数据报传送,在对方接受到的将是一个数据流,应用程序需要增加断帧的判断。当然可以采用修改注册表的方式改变1460的大小,但MicrcoSoft认为1460是最佳效率的参数,不建议修改。   在工控系统中,建议关闭Nagle算法,每次发送数据小于1460个字节(推荐1400),这样每次发送的是一个完整的数据报,减少对方对数据流的断帧处理。   3、同步方式中减少断网时connect函数的阻塞时间   同步方式中的断网时connect的阻塞时间为20秒左右,可采用gethostbyaddr事先判断到服务主机的路径是否是通的,或者先ping一下对方主机的IP地址。   A、采用gethostbyaddr阻塞时间不管成功与否为4秒左右。   例子:   LONG lPort=3024;   struct sockaddr_in ServerHostAddr;//服务主机地址    ServerHostAddr.sin_family=AF_INET;      ServerHostAddr.sin_port=::htons(u_short(lPort));      ServerHostAddr.sin_addr.s_addr=::inet_addr(192.168.1.3);      HOSTENT* pResult=gethostbyaddr((const char *) amp;      (ServerHostAddr.sin_addr.s_addr),4,AF_INET);      if(NULL==pResult)   {   int nErrorCode=WSAGetLastError();      TRACE(gethostbyaddr errorcode=%d,nErrorCode);     }      else      {   TRACE(gethostbyaddr %s\n,pResult-h_name);;   }   B、采用PING方式时间约2秒左右   暂略     4、同步方式中解决recv,send阻塞问题   采用select函数解决,在收发前先检查读写可用状态。   A、读   例子:   TIMEVAL tv01 = {0, 1};//1ms钟延迟,实际为0-10毫秒     int nSelectRet;      int nErrorCode;   FD_SET fdr = {1, sConnect};   nSelectRet=::select(0, amp;fdr, NULL, NULL, amp;tv01);//检查可读状态   if(SOCKET_ERROR==nSelectRet)      {   nErrorCode=WSAGetLastError();   TRACE(
显示全部
相似文档