你的位置:pcMing工作室 >> 资讯 >> 编程开发 >> C++编程 >> 详细内容 在线投稿

TCP/IP Winsock编程要点(转天极网)

排行榜 收藏 打印 发给朋友 举报 来源: 互联网   发布者:未知
热度2353票  浏览321次 【共0条评论】【我要评论 时间:2010年4月08日 20:29
利用Winsock编程由同步和异步方式,同步方式逻辑清晰,编程专注于应用,在抢先式的多任务操作系统中(WinNt、Win2K)采用多线程方式效率基本达到异步方式的水平,应此以下为同步方式编程要点。
-g]fE;ofu;b0pcMing工作室F+K"M!d8x.t_Mh l
  1、快速通信pcMing工作室%K(Cq2x!gH Q@H

:{5|%_ B8U.e N0  Winsock的Nagle算法将降低小数据报的发送速度,而系统默认是使用Nagle算法,使用pcMing工作室!t*[:kw(S,p
pcMing工作室;b9t xU i]'~R
int setsockopt(
#E@dy&G+Ai5S0
5P!H#W nD;G5in:Z0SOCKET s,pcMing工作室1i3lb"wS_E
pcMing工作室 K*D+qJ l)p1e*T3_
int level,pcMing工作室+gEa gC@
pcMing工作室u/xtCli
int optname,
Q(E{C:K&Ta]m0
CV;M` l"C0const char FAR *optval,pcMing工作室E%}/v!|,[4l
pcMing工作室L2T$G!D@+yj&X;^
int optlenpcMing工作室] qb1Z{N F
pcMing工作室)rX4@5^R{l b
);函数关闭它
pcMing工作室"Z{WVa dUB"p6f
  例子:
U IHX3hR-t9i:A0pcMing工作室^ L)j5vyrn
SOCKET sConnect;pcMing工作室}!K'v%t}"T3{@
pcMing工作室fsI ~:C]
sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
5I(z(K _g&j'Lx0pcMing工作室sl&@h"S H
int bNodelay = 1;
.T(rv'vwJ0pcMing工作室%D%o2Vs X:{
int err;pcMing工作室,b-B _\-y+\U.W8e
pcMing工作室|IP Y!ex
err = setsockopt(pcMing工作室Q1~*k,q%j(NDvV

/Xm-{"^dI0q|$b$s0sConnect,pcMing工作室7Q x7^)I(|*A6p L

,H{W'y0H YO0IPPROTO_TCP,pcMing工作室&f{3x _ I;fU
pcMing工作室kG;O }0},R
TCP_NODELAY,
)tK m+wS`3a0pcMing工作室4zF!BuewMKL?H
(char *)&bNodelay,
AF(dc n3sj r,Z0
)ve/rd d|vl0sizoeof(bNodelay));//不采用延时算法pcMing工作室 ]b4v#J2P'x
pcMing工作室 Y-R/t/NlcGl
if (err != NO_ERROR)pcMing工作室 YG;L QH'g;Pf!I
pcMing工作室0S^Y!wRD!P Y
TRACE ("setsockopt failed for some reason\n");;
pcMing工作室4A,@F@s
  2、SOCKET的SegMentSize和收发缓冲pcMing工作室]WG!y8c[ RQY

&x ng \!s5L0  TCPSegMentSize是发送接受时单个数据报的最大长度,系统默认为1460,收发缓冲大小为8192。pcMing工作室U({/tU!h-E Z"c+J

Jt*Vo/d0  在SOCK_STREAM方式下,如果单次发送数据超过1460,系统将分成多个数据报传送,在对方接受到的将是一个数据流,应用程序需要增加断帧的判断。当然可以采用修改注册表的方式改变1460的大小,但MicrcoSoft认为1460是最佳效率的参数,不建议修改。pcMing工作室4XIk-n9IxN+r p@g

"FJfhui Sf0  在工控系统中,建议关闭Nagle算法,每次发送数据小于1460个字节(推荐1400),这样每次发送的是一个完整的数据报,减少对方对数据流的断帧处理。
J]^ L:]0
(@"A;|S7m7@u/wh0  3、同步方式中减少断网时connect函数的阻塞时间pcMing工作室'X|4ROY
pcMing工作室IP3WQqBP
  同步方式中的断网时connect的阻塞时间为20秒左右,可采用gethostbyaddr事先判断到服务主机的路径是否是通的,或者先ping一下对方主机的IP地址。pcMing工作室F+xx|&s/EW7]
pcMing工作室:Y,M2pIl g"F\d1~)N.n
  A、采用gethostbyaddr阻塞时间不管成功与否为4秒左右。
3Y"Wz w5g6`x"w0pcMing工作室s1Vphf M ya
  例子:pcMing工作室{%M{@4zR%Q k[

Ia(F9H0P1B:SZl}|F0
LONG lPort=3024;
1Q1{ {[9Z {0
Xw!v's{"p;?Xd(x0struct sockaddr_in ServerHostAddr;//服务主机地址
$?bLg:cTMy0pcMing工作室#~L+}$w/P\vx
ServerHostAddr.sin_family=AF_INET;
$W$O7qRu]0pcMing工作室 { R$sIbG EEC`
ServerHostAddr.sin_port=::htons(u_short(lPort));pcMing工作室 _5~I!W0L5tJ3P6t
pcMing工作室0M.h9@+pi_?
ServerHostAddr.sin_addr.s_addr=::inet_addr("192.168.1.3");
/t*O-s$RX#L R&Cq0
)vs f?TUY)L7t'e0HOSTENT* pResult=gethostbyaddr((const char *) &
.J#HQl:w1q f6H)~0
(B UcF(w0P G5C8R0(ServerHostAddr.sin_addr.s_addr),4,AF_INET);pcMing工作室;_)dJ g2r4^
pcMing工作室 M0}{SG8[
if(NULL==pResult)
+\ A%~,d3O jp)W0u"r0
(TX-IC;yy&WD0{
D Q],{G?4kU(J0
r(Sc+{s)H4O0int nErrorCode=WSAGetLastError();pcMing工作室`(_:L&P0xkT+P

b,OE7k`M0TRACE("gethostbyaddr errorcode=%d",nErrorCode);
pIJ)L Kw0
Y+p%v"I1t'j0}
,H2o3e$C#P(p2\N!si0pcMing工作室,a{/jY;Lv
elsepcMing工作室4|VW%|~#f-s"y

[^h\2JS8E3Q0{pcMing工作室 ~ oH+eF/NUUs
pcMing工作室.d2{ wEE!z3y5Q%O
TRACE("gethostbyaddr %s\n",pResult->h_name);;pcMing工作室5r/M&]M2q^cC
pcMing工作室:\ SP+m$`(r
}
pcMing工作室X%Z2L x8R~
  B、采用PING方式时间约2秒左右pcMing工作室QU3j D"I%e,u+p
pcMing工作室2[EO1rNXic g|W
  暂略pcMing工作室a X@&u9f~3M

TAG: TCP Winsock
顶:114 踩:117
对本文中的事件或人物打分:
当前平均分:0.01 (767次打分)
对本篇资讯内容的质量打分:
当前平均分:-0.18 (712次打分)
【已经有643人表态】
98票
感动
79票
路过
72票
高兴
64票
难过
72票
搞笑
77票
愤怒
85票
无聊
96票
同情
上一篇 下一篇
发表评论
换一张

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】

网络资源