+ -
当前位置:首页 → 问答吧 → recv返回问题

recv返回问题

时间:2011-12-08

来源:互联网

请教各位大侠
用非阻塞模式时,用recv返回。。我想测试下缓冲区有多大。。
就设置了buf<8k,>8k的几种情况,可是recv返回值都是我设置的buf的大小,
不是说recv返回的是缓冲区拷贝到buf中的大小嘛??那么最多也只可能返回缓冲区的大小8k?16k?
可是结果不管我怎么测试都是buf的大小。。。之前在同一台电脑上测,百度出可能是因为127.0.0.01,数据没有经过缓冲区。。现在环境:服务器在虚拟机上,虚拟机网络连接采用的是桥接。。buf也有memset了
结果还是一样。。故请教各位recv中的buf跟缓冲区的关系

作者: ocean0606   发布时间: 2011-12-08

貌似是有数据到来的时候由网卡接到下来保存到缓冲区中,运用程序调用recv或者是WSARecv从网卡的缓冲区中拷贝到你在程序中设置的那个缓冲中(这里通常是一个字符数组)

作者: maoxing63570   发布时间: 2011-12-08

非阻塞一般都是返回0 等数据来了由OVER结构或者完成端口通知

系统缓冲区是默认设置的 一般就是8K还是16K buf是你要接收的缓冲区 数据由网卡接收 然后放入系统的缓冲区 操作系统再从系统缓冲区里把数据 拷贝到你的buf

作者: yaozhiyong110   发布时间: 2011-12-08

恩。。那么recv返回的应该是recv缓冲区的大小吧。。可是为什么测试时,不管程序缓冲区多大,都是返回程序缓冲区的大小,,好像就没有系统缓冲区似的。。。
引用 1 楼 maoxing63570 的回复:

貌似是有数据到来的时候由网卡接到下来保存到缓冲区中,运用程序调用recv或者是WSARecv从网卡的缓冲区中拷贝到你在程序中设置的那个缓冲中(这里通常是一个字符数组)

作者: ocean0606   发布时间: 2011-12-08

谢谢。。那recv是系统缓冲区满了返回,还是buf满了返回,,如果是系统缓冲区,那返回的数据大小应该是<或=缓冲区吧。。可是我测试的时候buf都设置成90000了。。只要发送数据有这么大,照样返回90000.。。。是否是测试环境??我服务端运行在虚拟机上,虚拟机用桥接
引用 2 楼 yaozhiyong110 的回复:

非阻塞一般都是返回0 等数据来了由OVER结构或者完成端口通知

系统缓冲区是默认设置的 一般就是8K还是16K buf是你要接收的缓冲区 数据由网卡接收 然后放入系统的缓冲区 操作系统再从系统缓冲区里把数据 拷贝到你的buf

作者: ocean0606   发布时间: 2011-12-08

非阻塞的是马上返回 阻塞的是有数据来了就返回 来了多少就返回多少 只要不超出你要接收的量

你的recv是非阻塞的? 自己给自己机子发?

作者: yaozhiyong110   发布时间: 2011-12-08

我的接收端是非阻塞,运行在虚拟机上。。
来了多少就返回多少。。如果我用阻塞模式在发送端发送一个100mb的数据。。那我接收端buf也设置成100mb那能一次接受完嘛??还是说一次返回缓冲区中的数据。。也就是8k,或16k??
引用 5 楼 yaozhiyong110 的回复:

非阻塞的是马上返回 阻塞的是有数据来了就返回 来了多少就返回多少 只要不超出你要接收的量

你的recv是非阻塞的? 自己给自己机子发?

作者: ocean0606   发布时间: 2011-12-08

首先你一次发送100mb肯定不可能发完的 根据返回值你可以知道 系统这一次发送了多少 你再继续循环调用send直到发送你了要发送的数据

接收同理...

PS: TCP是流模式的 就是说 数据是连续的 你一次没接收完 数据还在那里 所以不用担心 一次没有把
所有的来的数据接收完导致丢失 不过要考虑 发送太快 导致接收的系统缓冲区溢出 那么数据就丢了
即使这样 发送方也是能根据返回值 知道某些数据接收方的网卡没有接收...

作者: yaozhiyong110   发布时间: 2011-12-09