===>使用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; }