windows sockets 编程之recv()

在使用VC6进行TCP/IP编程时,遇到recv()函数导致进程卡顿的难题。最初误认为是资源不足,但观察资源管理器后排除此可能性。经过调试,确认问题源于recv()函数。recv()在接收缓冲区无数据或数据已被发送时会等待,直到协议接收完毕。为了解决这个问题,需要理解recv()如何处理超过buf长度的数据,并可能需要多次调用以接收完整数据。
摘要由CSDN通过智能技术生成

这几天在用VC6进行TCP/IP编程,但是过程中还是出现了不少问题。比如一个就是定义了全局变量,就不应该再次在函数中进行定义了。现在我又遇到一个新的问题,就是在使用recv()时出现了卡进程的情况,一开始我还以为是因为采集太快的问题导致了系统的资源不足,但在看完资源管理器之后,这个想法被我否定了。系统的的资源管理器中内存并没有太大变化。

之后我开始怀疑是recv()函数出现了问题,通过调试也证实了我这个想法。一不做,二不休,我赶紧查看了recv()相关具体描述,发现了:

“如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,直到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的)”。

而且我也找到了recv()的一个实例:

while(rs)
{
​buflen = recv(activeevents[i].data.fd, buf, sizeof(buf), 0);
​if(buflen < 0)
{
// 由于是非阻塞的模式,所以当errno为EAGAIN时,表示当前缓冲区已无数据可读
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值