===>使用setsockopt改变发送和接收的BUF,结果程序发送和接收受影响很大...
我的服务器端使用的IOCP,客户端使用的选择模式,因为在客户端接收数据出现了接收一包数据部完整的情况,所以现在设置了发送和接收的缓冲区为0,结果导致每秒只有5个左右的数据包,没设置的时候每秒在1600个左右。
int nZero=0;setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));
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里,可以屏蔽掉该算法:
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 ; }
[解决办法]
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; }