+ -
当前位置:首页 → 问答吧 → ===>使用setsockopt改变发送和接收的BUF,结果程序发送和接收受影响很大...

===>使用setsockopt改变发送和接收的BUF,结果程序发送和接收受影响很大...

时间:2011-11-25

来源:互联网

我的服务器端使用的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));
哪位朋友知道怎么回事呢?

作者: wswwxk   发布时间: 2011-11-25

应该与这个Buffer关系不大吧!我以前也改大过,发现也不能多点之类的。
因为在客户端接收数据出现了接收一包数据不完整的情况!解决方法不是设置这个,而是把消息发送时,增加产学头部,直到读到相应在消息长度,才处理啊。
如Header部分为 WORD wID; //消息ID
char cFeather; //为一个检查字符
DWORD dwMsgLen; //消息内容的长度。
每次客户端收时,先 Recv 7字节的头部,然后再根据头部 Recv相应的数据长度。完整后再处理。
如果Recv为0,表示同步读法的,对方断开连接。自己关闭Socket

作者: brightLee   发布时间: 2011-11-25

你应该禁用Nagle

作者: mxzy55560593   发布时间: 2011-11-25

引用 1 楼 brightlee 的回复:
应该与这个Buffer关系不大吧!我以前也改大过,发现也不能多点之类的。
因为在客户端接收数据出现了接收一包数据不完整的情况!解决方法不是设置这个,而是把消息发送时,增加产学头部,直到读到相应在消息长度,才处理啊。
如Header部分为 WORD wID; //消息ID
char cFeather; //为一个检查字符
DWORD dwMsgLen; //消息内容的长度。
每次客户端收时……

这个我知道,我的每个包的开始都有4字节的数据,表示发送的数据长度,现在我只想知道上面的问题为什么会这样?

作者: wswwxk   发布时间: 2011-11-25

引用 2 楼 mxzy55560593 的回复:
你应该禁用Nagle

设置了禁用Nagle,跟没设置一样的效果...求解释

作者: wswwxk   发布时间: 2011-11-25

setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));

很重要.0 buff.就是把系统sock分配的缓冲区不用了.直接用你程序提供的buff.内核网络层会经常读取你程序的指定的sock buff内存.效率低.可想而知.

作者: smwhotjay   发布时间: 2011-11-25

引用 5 楼 smwhotjay 的回复:
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));

很重要.0 buff.就是把系统sock分配的缓冲区不用了.直接用你程序提供的buff.内核网络层会……

那服务器端的完成端口,怎么没这问题呢?

作者: wswwxk   发布时间: 2011-11-25