在VC中的CSocket的派生类中,为了TCP不粘包,设置NODELAY
int bNodelay=1;
SetSockOpt(TCP_NODELAY, (char *)&bNodelay, sizeof(bNodelay),IPPROTO_TCP)
上次问了一次粘包问题,得到这个解答,但是试的时候时好时坏。
是这个语句在函数中的位置决定的吗?
我分别在AfxSocketInit();的前后,create的前后,connect的前后都用了这个函数,好像还是不行,各位帮忙想个招。
谢谢啦。
int bNodelay=1;
SetSockOpt(TCP_NODELAY, (char *)&bNodelay, sizeof(bNodelay),IPPROTO_TCP)
上次问了一次粘包问题,得到这个解答,但是试的时候时好时坏。
是这个语句在函数中的位置决定的吗?
我分别在AfxSocketInit();的前后,create的前后,connect的前后都用了这个函数,好像还是不行,各位帮忙想个招。
谢谢啦。
我同事在VXWORKS上用了这个是可以的,是SDK的setsockopt。
而我在MFC的CSOCKET下面就搞不定,,好郁闷啊!~~
知道的说一声啊,分不够再添啊!~~
自己定义协议来保证在TCP下的正常吧。
粘包问题 的产生据我所知有两种情况:
1)开启了Nagle算法,发送方的TCP/IP栈可能自己在本地把几个小包结合成一个大包发送给接受方。
2)接受方包处理速度低于发送方的发送速度,导致,在接受方在调用recv/WSARecv时一次接受了
多个包的内容。在调用socket接受函数的时候,系统会把当前该套接字上接受到的数据一起返回给
socket的。如果还有其它的方式产生粘包,请各位兄弟提出。
大家参考一下:
m_nLengthR=Receive(&(discarddata),3);
if(m_nLengthR==3)
{
TotalLen=(discarddata[1]<<8)+discarddata[2];
m_nLengthR = Receive(&(discarddata[3]),TotalLen-3);
m_nLengthR=m_nLengthR+3;
}
其中协议各字节定为0字节为类型;1、2为长度。后面为数据。
如果粘包,先取出长度,再取其余的。
各位帮我看一下这个代码有没有漏洞。