当前位置:萝卜系统下载站 > 技术开发教程 > 详细页面

TCP/IP Winsock编程重点

TCP/IP Winsock编程重点

更新时间:2022-07-14 文章作者:未知 信息来源:网络 阅读次数:

  利用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 *)&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 *) &

  (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秒左右

   暂略

[1] [2]  下一页

温馨提示:喜欢本站的话,请收藏一下本站!

本类教程下载

系统下载排行

网站地图xml | 网站地图html