当前位置: 技术问答>linux和unix
关于socket编程的一个难点:recv()函数的返回问题!
来源: 互联网 发布时间:2016-11-01
本文导语: 本帖最后由 fififisher 于 2011-01-06 10:54:23 编辑 在客户端,发送"I love you!",按以下三种办法发送,其中ClientSocket是客户端的套接字描述符: 第一种: string str("I love you!"); send(CientSocket, str.c_str(), str.size(), 0); 第二种...
第一种:
string str("I love you!");
send(CientSocket, str.c_str(), str.size(), 0);
第二种:
string str1("I love");
string str2(" you!");
send(CientSocket, str1.c_str(), str1.size(), 0);
send(CientSocket, str2.c_str(), str2.size(), 0);
第三种:
string str1("I love");
string str2(" you!");
send(CientSocket, str1.c_str(), str1.size(), 0);
sleep(10秒);
send(CientSocket, str2.c_str(), str2.size(), 0);
请问:
服务端的recv()函数,分别返回多少次?
第一种情况,我知道肯定是返回一次。
问题是第二和第三种情况,很难区分。
关键是,我不知道recv()函数返回的条件。即当符合什么条件,recv()函数就会(才会)返回?
|
一般情况下,发送端需要先发送4字节发送缓冲的长度给接收端,这样接收端才好按接收到的长度来接收真正的数据。
另外send()和recv()一般都需要重载一下,因为send()一次返回,可能并不是你真正想发送的长度,recv()一次返回,也可能不是接收到你想接收的长度。google一下,参考代码很多的,也很简单,比如发送1MB的字节,可能第一次返回只发送了20KB,需要你while一下才能全发出去,recv也类似。
另外send()和recv()一般都需要重载一下,因为send()一次返回,可能并不是你真正想发送的长度,recv()一次返回,也可能不是接收到你想接收的长度。google一下,参考代码很多的,也很简单,比如发送1MB的字节,可能第一次返回只发送了20KB,需要你while一下才能全发出去,recv也类似。