在VC中的CSocket的派生类中,为了TCP不粘包,设置NODELAY
int bNodelay=1;
SetSockOpt(TCP_NODELAY, (char *)&bNodelay, sizeof(bNodelay),IPPROTO_TCP)
上次问了一次粘包问题,得到这个解答,但是试的时候时好时坏。
是这个语句在函数中的位置决定的吗?
我分别在AfxSocketInit();的前后,create的前后,connect的前后都用了这个函数,好像还是不行,各位帮忙想个招。
谢谢啦。

解决方案 »

  1.   

    别叫我改程序了,就这个吧,
    我同事在VXWORKS上用了这个是可以的,是SDK的setsockopt。
    而我在MFC的CSOCKET下面就搞不定,,好郁闷啊!~~
    知道的说一声啊,分不够再添啊!~~
      

  2.   

    参考http://www.vckbase.com/document/viewdoc/?id=1203
      

  3.   

    dirdirdir3(风) 的文章我发帖前看过了,就是因为它里面这句:“若程序中设置了“发送不延迟”:(setsockopt (socket_name,ipproto_tcp,tcp_nodelay,(char *) &on,sizeof on) ,其中on=1),则不存在粘包现象。”我才苦苦找寻这句语句的用法的。。
      

  4.   

    你设置这个OPTION,然后你使用sniffer来抓包,这个时候你一秒发送一个或多个小包,例如50B,看sniffer抓到的间隔就可以判断你的设置是否work了
      

  5.   

    楼主的方法不能解决粘包问题粘包唯一解决之道就是将其封装,就是DentistryDoctor说的ps:我说的TCP
      

  6.   

    呵呵,UDP也不可能出现粘包。
    自己定义协议来保证在TCP下的正常吧。
      

  7.   

    设置NODELAY 只是禁用了TCP的Nagle算法。
    粘包问题 的产生据我所知有两种情况:
    1)开启了Nagle算法,发送方的TCP/IP栈可能自己在本地把几个小包结合成一个大包发送给接受方。
    2)接受方包处理速度低于发送方的发送速度,导致,在接受方在调用recv/WSARecv时一次接受了
       多个包的内容。在调用socket接受函数的时候,系统会把当前该套接字上接受到的数据一起返回给
       socket的。如果还有其它的方式产生粘包,请各位兄弟提出。
      

  8.   

    现在先写了一个分包的,
    大家参考一下:
    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为长度。后面为数据。
    如果粘包,先取出长度,再取其余的。
    各位帮我看一下这个代码有没有漏洞。