当前位置:编程学习 > C/C++ >>

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 *)&bNodelay,

 

sizoeof(bNodelay));//不采用延时算法

 

if (err != NO_ERROR)

 

TRACE ("setsockopt failed for some reason ");; 

 

  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

 

{

 

补充:软件开发 , C语言 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,