这几天在用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时,表示当前缓冲区已无数据可读