当用select()检测到有数据可读时,我用recv()接收,可是:
1)为什么有时候select()检测到有数据可以接收,而我用recv()却接收不到数据?
2)我给recv()定的接收区大小是3000字节。如果实际数据不止3000,剩下的数据系统是怎么处理的?是否可以用select()继续检测?并继续读出数据?还是数据丢失了?还是数据没有丢失,但select()检测不到?
3)如何判断还有没有剩余的数据没有读出?

解决方案 »

  1.   

    1)其他事件导致select返回;
    2)在一定的时间内可以继续读出
      

  2.   

    1.如果你的Listen的Socket也在select的数组中的话,当有客户connect时,select也会认为这个SOCKET可读,但你这时应该做的是accept而不是recv
    2.好象是,我也没有十分把握:
    如果数据一次读不完,剩下的数据应该仍然在系统缓冲区种,同时此SOCKET仍然可读,可以继续用select选择,我没试过,但从写程序的角度而言,这是完全应该的,同时实现也不难。你可以专门写一个程序试一下。
      

  3.   

    补充:
    如果你在select中3个数组都给了值的话,当可写、及发生异常时select也会返回,但这时readfds里应该是空的。
      

  4.   

    我是在做一个动态连接库
    在连接库中,实现获取邮件信息的功能,我在VBA中调用这个连接库。当我用另一个程序模拟服务器时,一切正常。
    可是,当我连接POP.163.com时,却在发送USER XXX,后,不断的收到不明信息,用MessageBox()显示出一个空字符串(即没有任何内容),因而造成虚拟内存不足。
    是什么原因呀?
      

  5.   

    你的socket是
    udp的还是tcp的
    各有各的接收机制
    recv()是udp的
      

  6.   

    你要读邮件就用MAPI好了,直接用SOCKET去解析POP3协议,代价太大。
      

  7.   

    协议肯定是tcp,关于数据长度,我只能根据对方的"\r\n.\r\n"结束符判断。
    我的思路如下,请看有没有问题:
    有一个全局变量state
    在主程序里有如下语句(其中一段,其他语句和它类似):
    while(state!=="passok"&&state!=="receiveok")DoEvents(msocket);
    if(state=="receiveok")
    return 0;       //当出现任何错误,例如密码错误时,state设为“receiveok",返回错误
    send(........);
    while(....)DoEvents(msocket);
    .......
    return 1;DoEvents(SOCKET msocket)过程里,用select判断有无数据可读,时间设为20秒,如返回零,设state="receiveok",return.否则,调用receive(msocket)receive函数是根据收到的数据,如果不是以”+OK“或”-ER“开头就return,否则重新设置state,如果以”-ER“开头,state="receiveok".否则....
    在此函数的开头部分,还判断是否正在接收TOP或RETR命令返回的数据,如果是,不管数据是什么内容,strcat到一个全局变量(以后从这个变量取得数据),如果数据包括”\r\n.\r\n",重新设置state,return.