TCPIP Winsock网络编程综述.doc_第1页
TCPIP Winsock网络编程综述.doc_第2页
TCPIP Winsock网络编程综述.doc_第3页
TCPIP Winsock网络编程综述.doc_第4页
TCPIP Winsock网络编程综述.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 reasonn); 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 %sn,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(select read status errorcode=%d,nErrorCode); :closesocket(sConnect); goto 重新连接(客户方),或服务线程退出(服务方); if(nSelectRet=0)/超时发生,无可读数据 继续查读状态或向对方主动发送 else 读数据 B、写 TIMEVAL tv01 = 0, 1;/1ms钟延迟,实际为9-10毫秒 int nSelectRet; int nErrorCode; FD_SET fdw = 1, sConnect; nSelectRet=:select(0, NULL, NULL,amp;fdw, amp;tv01);/检查可写状态 if(SOCKET_ERROR=nSelectRet) nErrorCode=WSAGetLastError(); TRACE(select write status errorcode=%d,nErrorCode); :closesocket(sConnect); /goto 重新连接(客户方),或服务线程退出(服务方); if(nSelectRet=0)/超时发生,缓冲满或网络忙 /继续查写状态或查读状态 else /发送 5、改变TCP收发缓冲区大小 系统默认为8192,利用如下方式可改变。 SOCKET sConnect; sConnect=:socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); int nrcvbuf=1024*20; int err=setsockopt( sConnect, SOL_SOCKET, SO_SNDBUF,/写缓冲,读缓冲为SO_RCVBUF (char *)amp;nrcvbuf, sizeof(nrcvbuf); if (err != NO_ERROR) TRACE(setsockopt Error!n); 在设置缓冲时,检查是否真正设置成功用 int getsockopt( SOCKET s, int level, int optname, char FAR *optval, int FAR *optlen ); 6、服务方同一端口多IP地址的bind和listen 在可靠性要求高的应用中,要求使用双网和多网络通道,再服务方很容易实现,用如下方式可建立客户对本机所有IP地址在端口3024下的请求服务。 SOCKET hServerSocket_DS=INVALID_SOCKET; struct sockaddr_in HostAddr_DS;/服务器主机地址 LONG lPort=3024; HostAddr_DS.sin_family=AF_INET; HostAddr_DS.sin_port=:htons(u_short(lPort); HostAddr_DS.sin_addr.s_addr=htonl(INADDR_ANY); hServerSocket_DS=:socket( AF_INET, SOCK_STREAM,IPPROTO_TCP); if(hServerSocket_DS=INVALID_SOCKET) AfxMessageBox(建立数据服务器SOCKET 失败!); return FALSE; if(SOCKET_ERROR=:bind(hServerSocket_DS,(struct sockaddr *)(amp;(HostAddr_DS),sizeof(SOCKADDR) int nErrorCode=WSAGetLastError (); TRACE(bind error=%dn,nErrorCode); AfxMessageBox(Socket Bind 错误!); return FALSE; if(SOCKET_ERROR=:listen(hServerSocket_DS,10)/10个客户 AfxMessageBox(Socket listen 错误!); return FALSE; AfxBeginThread(ServerThreadProc,NULL,THREAD_PRIORITY_NORMAL); 在客户方要复杂一些,连接断后,重联不成功则应换下一个IP地址连接。也可采用同时连接好后备用的方式。 7、用TCP/IP Winsock实现变种Client/Server 传统的Client/Server为客户问、服务答,收发是成对出现的。而变种的Client/Server是指在连接时有客户和服务之分,建立好

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论