资源描述:
《TCPIP Winsock网络编程综述》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、TCP/IPWinsock网络编程综述利用Winsock编程由同步和异步方式,同步方式逻辑清晰,编程专注于应用,在抢先式的多任务操作系统中(WinNt、Win2K)采用多线程方式效率基本达到异步方式的水平,应此以下为同步方式编程要点。 1、快速通信 Winsock的Nagle算法将降低小数据报的发送速度,而系统默认是使用Nagle算法,使用 intsetsockopt( SOCKETs, intlevel, intoptname, constcharFAR*optval, intoptlen );函数关闭它 例子: SOCKETsConnect;
2、 sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); intbNodelay=1; interr; err=setsockopt( sConnect, IPPROTO_TCP, TCP_NODELAY, (char*)amp;bNodelay, sizoeof(bNodelay));//不采用延时算法 if(err!=NO_ERROR) TRACE("setsockoptfailedforsomereason");; 2、SOCKET的SegMentSize和收发缓冲 TCPSegMentSi
3、ze是发送接受时单个数据报的最大长度,系统默认为1460,收发缓冲大小为8192。 在SOCK_STREAM方式下,如果单次发送数据超过1460,系统将分成多个数据报传送,在对方接受到的将是一个数据流,应用程序需要增加断帧的判断。当然可以采用修改注册表的方式改变1460的大小,但MicrcoSoft认为1460是最佳效率的参数,不建议修改。 在工控系统中,建议关闭Nagle算法,每次发送数据小于1460个字节(推荐1400),这样每次发送的是一个完整的数据报,减少对方对数据流的断帧处理。 3、同步方式中减少断网时connect函数的阻塞时间 同步方式中的断网时conne
4、ct的阻塞时间为20秒左右,可采用gethostbyaddr事先判断到服务主机的路径是否是通的,或者先ping一下对方主机的IP地址。 A、采用gethostbyaddr阻塞时间不管成功与否为4秒左右。 例子: LONGlPort=3024; structsockaddr_inServerHostAddr;//服务主机地址 ServerHostAddr.sin_family=AF_INET; ServerHostAddr.sin_port=::htons(u_short(lPort)); ServerHostAddr.sin_addr.s_addr=::
5、inet_addr("192.168.1.3"); HOSTENT*pResult=gethostbyaddr((constchar*)amp; (ServerHostAddr.sin_addr.s_addr),4,AF_INET); if(NULL==pResult) { intnErrorCode=WSAGetLastError(); TRACE("gethostbyaddrerrorcode=%d",nErrorCode); } else { TRACE("gethostbyaddr%s",pResult->h_name)
6、;; } B、采用PING方式时间约2秒左右 暂略 4、同步方式中解决recv,send阻塞问题 采用select函数解决,在收发前先检查读写可用状态。 A、读 例子: TIMEVALtv01={0,1};//1ms钟延迟,实际为0-10毫秒 intnSelectRet; intnErrorCode; FD_SETfdr={1,sConnect}; nSelectRet=::select(0,amp;fdr,NULL,NULL,amp;tv01);//检查可读状态 if(SOCKET_ERROR==nSelectRet) { nErr
7、orCode=WSAGetLastError(); TRACE("selectreadstatuserrorcode=%d",nErrorCode); ::closesocket(sConnect); goto重新连接(客户方),或服务线程退出(服务方); } if(nSelectRet==0)//超时发生,无可读数据 { 继续查读状态或向对方主动发送 } else{ 读数据 } B、写 TIMEVALtv01={0,1};//1ms钟延迟,实际为9