linux 下socket的recv函数返回值问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 下socket的recv函数返回值问题相关的知识,希望对你有一定的参考价值。
用recv接收12字节后一切正常,但再调用时,明明还会有东西要接收,结果返回-1错误,查看errno变量是134,请问是什么错误?
tcp
不管怎么说,在recv之前调用一下select(),检查缓冲到底有没有内容,如果有,再执行recv就不会有任何问题。而且 select的好处是,如果没有接到别的东西,你可以sleep()一下,不占用CPU
用下面的rcv代替你的recv函数吧,我在嵌入式系统开发时自己写的一个标准例程,很可靠:
参数解释:
sck - socket
buf - 接收缓冲区
size-缓冲区大小
time_out-等待时间(按秒计)如果超时则返回
返回值:收到字节数,0表示超时等错误
int rcv(int sck, void * buf, int size, int time_out)
if (sck < 1 || !buf || size < 1) return 0;
timeval tv = 0, 0; timeval * ptv = 0;
if (time_out > 0) tv.tv_sec = time_out; ptv = &tv;
memset(buf, 0, size);
int r = 0; char * b = (char*) buf; int sz = size;
fd_set rd, er; int total = 0; time_t t0 = time(0); time_t t1 = 0;
do
FD_ZERO(&rd); FD_SET(sck, &rd);
FD_ZERO(&er); FD_SET(sck, &er);
r = select(sck + 1, &rd, 0, &er, ptv);
if (r == -1) nperror("select()"); return -1;
if (FD_ISSET(sck, &er))
nperror("socket(shutdown)"); return -1;
//end if
if (FD_ISSET(sck, &rd))
r = recv(sck, b, sz, 0);
if (r == -1) nperror("recv()"); return -1;
total += r; sz -= r; b+= r;
//end if
if (time_out > 0)
t1 = time(0) - t0;
else
t1 = time_out - 1;
//end if
while(sz && t1 < time_out);
return total;
//end if本回答被提问者采纳
在Python3中,socket.recv方法如果一段时间内没有收到返回,如何让这段代码跳过,并执行下一步操作
socket.recv(2048)
print('超时') #如果上面的代码没有收到返回 超时5秒后进入下一步
以上是关于linux 下socket的recv函数返回值问题的主要内容,如果未能解决你的问题,请参考以下文章