日期:2014-05-16  浏览次数:20796 次

关于阻塞recv ,send的纠结的问题!!
阻塞的socket的recv,以及send都是阻塞函数,我有个疑问,假如先循环到接收1客户socket上的数据,若是1客户socket没有发送数据,那系统的接收缓冲区也就没数据,那recv不是得要一直阻塞下去吗,至于连接上的其他客户socket我们也就循环不下去了,被1客户给阻塞,可为什么程序貌似并不是这么回事,想了好久一直想不明白,请大牛解答下,谢谢?
贴上部分代码
//...
int bytes;
int nRet;
for(int i = 0; i < ids; i++)
{
   //memset(buf, 0, sizeof(buf));
   memset(myStructData.m_sData, 0, sizeof(myStructData.m_sData));

  //接收前先清空系统缓冲区;setsockopt是修改socket的某个特性选项
   nRet = setsockopt(serverSocket, SOL_SOCKET, SO_RCVBUF, (char*)&myStructData, sizeof(myStructData));
   if (nRet != 0) 
   { 
       return -1;
    } 

    if((bytes=recv(fd[i],(char*)&myStructData,sizeof(myStructData),0))==SOCKET_ERROR)
    {
printf("接收数据失败!\n");
exit(-1);
    }
 //...
}

------解决方案--------------------
首先setsockopt用错了,那是设置内核缓冲区大小的,不是让你传一个缓冲区进去。

另外,解决楼主的疑惑,楼主要学event driven program.
------解决方案--------------------
event driven program. 这一步你可以晚点学,但是怎么用setsockopt,资料大把,把这个用对了先。
http://blog.csdn.net/chary8088/article/details/2486377 看下setsockopt的用法。