读书人

===gt;使用setsockopt改变发送和接收的B

发布时间: 2012-02-01 16:58:19 作者: rapoo

===>使用setsockopt改变发送和接收的BUF,结果程序发送和接收受影响很大...
我的服务器端使用的IOCP,客户端使用的选择模式,因为在客户端接收数据出现了接收一包数据部完整的情况,所以现在设置了发送和接收的缓冲区为0,结果导致每秒只有5个左右的数据包,没设置的时候每秒在1600个左右。 

C/C++ code
int nZero=0;setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));
哪位朋友知道怎么回事呢?


[解决办法]
应该与这个Buffer关系不大吧!我以前也改大过,发现也不能多点之类的。
因为在客户端接收数据出现了接收一包数据不完整的情况!解决方法不是设置这个,而是把消息发送时,增加产学头部,直到读到相应在消息长度,才处理啊。
如Header部分为 WORD wID; //消息ID
char cFeather; //为一个检查字符
DWORD dwMsgLen; //消息内容的长度。
每次客户端收时,先 Recv 7字节的头部,然后再根据头部 Recv相应的数据长度。完整后再处理。
如果Recv为0,表示同步读法的,对方断开连接。自己关闭Socket
[解决办法]
你应该禁用Nagle
[解决办法]
C/C++ code
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));
[解决办法]
Nagle算法用于对缓冲区内的一定数量的消息进行自动连接。该处理过程(称为Nagling),通过减少必须发送的封包的数量,提高了网络应用 程序系统的效率。(Nagle虽然解决了小封包问题,但也导致了较高的不可预测的延迟,同时降低了吞吐量。)

vc下面socket编程,使用阻塞方式的时候,会自动使用Nagle算法,如:当pc不断发送32Bytes的数据的时候,会将这些包合并起来一起发送。如果另一头使用的时候一个tcp包一条命令处理的话,会出问题的。

在vc里,可以屏蔽掉该算法:
C/C++ code
    const char chOpt=1;       int   nErr=setsockopt(   m_socket,   IPPROTO_TCP,   TCP_NODELAY,   &chOpt,   sizeof(char));       if(nErr==-1)       {        TRACE(_T("setsockopt()   error\n"),WSAGetLastError());        return ;       }
[解决办法]
C/C++ code
        static bool DisableNagle(SOCKET pSock)        {            // 禁用Nagle算法            char bNagleValue = 1;            if(SOCKET_ERROR == setsockopt(pSock,IPPROTO_TCP,TCP_NODELAY,(char*)&bNagleValue,sizeof(bNagleValue)))            {                return false;            }            // 设置缓冲区            int nBufferSize = 0;//NET_BUFFER_SIZE;            if(SOCKET_ERROR == setsockopt(pSock,SOL_SOCKET,SO_SNDBUF,(char*)&nBufferSize,sizeof(nBufferSize)))            {                return false;            }            nBufferSize = 0;//NET_BUFFER_SIZE;            if(SOCKET_ERROR == setsockopt(pSock,SOL_SOCKET,SO_RCVBUF,(char*)&nBufferSize,sizeof(nBufferSize)))            {                return false;            }            nBufferSize = 0;            if(SOCKET_ERROR == setsockopt(pSock,SOL_SOCKET,SO_RCVTIMEO,(char*)&nBufferSize,sizeof(nBufferSize)))            {                return false;            }            if(SOCKET_ERROR == setsockopt(pSock,SOL_SOCKET,SO_SNDTIMEO,(char*)&nBufferSize,sizeof(nBufferSize)))            {                return false;            }            return true;        } 

读书人网 >VC/MFC

热点推荐