当用select()检测到有数据可读时,我用recv()接收,可是:
1)为什么有时候select()检测到有数据可以接收,而我用recv()却接收不到数据?
2)我给recv()定的接收区大小是3000字节。如果实际数据不止3000,剩下的数据系统是怎么处理的?是否可以用select()继续检测?并继续读出数据?还是数据丢失了?还是数据没有丢失,但select()检测不到?
3)如何判断还有没有剩余的数据没有读出?
1)为什么有时候select()检测到有数据可以接收,而我用recv()却接收不到数据?
2)我给recv()定的接收区大小是3000字节。如果实际数据不止3000,剩下的数据系统是怎么处理的?是否可以用select()继续检测?并继续读出数据?还是数据丢失了?还是数据没有丢失,但select()检测不到?
3)如何判断还有没有剩余的数据没有读出?
2)在一定的时间内可以继续读出
2.好象是,我也没有十分把握:
如果数据一次读不完,剩下的数据应该仍然在系统缓冲区种,同时此SOCKET仍然可读,可以继续用select选择,我没试过,但从写程序的角度而言,这是完全应该的,同时实现也不难。你可以专门写一个程序试一下。
如果你在select中3个数组都给了值的话,当可写、及发生异常时select也会返回,但这时readfds里应该是空的。
在连接库中,实现获取邮件信息的功能,我在VBA中调用这个连接库。当我用另一个程序模拟服务器时,一切正常。
可是,当我连接POP.163.com时,却在发送USER XXX,后,不断的收到不明信息,用MessageBox()显示出一个空字符串(即没有任何内容),因而造成虚拟内存不足。
是什么原因呀?
udp的还是tcp的
各有各的接收机制
recv()是udp的
我的思路如下,请看有没有问题:
有一个全局变量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.