recv读取套接字返回值问题

tianchangxi 2012-06-11 11:22:26
我用的是非阻塞模式读取套接字内容,sz 为要读取的字节数,有的时候能够正常输出结果,但是有时候结果却输出:r_len > 0 r_len = -1,这是为什么啊?从没遇见过!请求高手指点一下!

while(sz != 0)
{
r_len = recv(s_fd, p1, sz, 0);
if (r_len < 0)
{
if ((errno == EINTR) || (errno == EWOULDBLOCK))
{
sleep(1);
continue;
}
xlog_error(__FILE__,__LINE__,"recv(): %s !", strerror(errno));
close(s_fd);
s_fd = -1;
goto connect;
}
if (r_len == 0)
{
printf("The server is close socket !");
break;
}
if (r_len > 0)
{
printf("r_len > 0 r_len = %d\n", r_len);
sz -= r_len;
p1 += r_len;
}
}
...全文
231 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
embed_rookie 2012-07-14
  • 打赏
  • 举报
回复
返回-1应该时对方主动关闭链接了吧
qq120848369 2012-06-11
  • 打赏
  • 举报
回复
同样没看出来。
Wenxy1 2012-06-11
  • 打赏
  • 举报
回复
查看recv函数帮助文档:
#man recv

一般是对方关闭了连接。
justkk 2012-06-11
  • 打赏
  • 举报
回复
没看出问题
VNROOY 2012-06-11
  • 打赏
  • 举报
回复
看看线程
qq120848369 2012-06-11
  • 打赏
  • 举报
回复
看看是不是多线程,内存越界访问之类的。
fdl19881 2012-06-11
  • 打赏
  • 举报
回复
recv的标准返回值类型ssize_t 是一种signed 类型
而size_t 是一种unsigned类型。
fdl19881 2012-06-11
  • 打赏
  • 举报
回复
请问你的r_len是什么类型?
如果你的r_len是unsigned (size_t也是unsigned类型)类型的话,
那就会出现这种情况 。

如果r_len 为unsigned类型,那么在和别的数比较时,都会提升为unsigned类型
则r_len < 0的结果肯定会为false

而printf里面又是%d , , ,传到printf里面的时候,r_len会做一次隐式类型转换为signed类型。从而导致r_len被输出为-1 ..

在程序里面最好不要使用unsigned类型,即使有些时候只可能表示正的情况 (如年龄,身高等). 否则在做比较的时候一定要注意类型的隐式提升! 最近正在看《C专家编程》里面的话。

不信你可以试试下面一句话

#include <stdio.h>
int main(void)
{
unsigned a ;
a = -1;
if( a < 0)
printf("a < 0!!\n");
else
printf("a >= 0!!!\n");
printf("%%u : %u\n" , a);
printf("%%d : %d\n" , a);
return 0;
}

tianchangxi 2012-06-11
  • 打赏
  • 举报
回复
查看recv函数帮助文档:
#man recv

一般是对方关闭了连接。


如果对方关闭连接recv的返回值应该为0啊!为什么我的判断条件是if(r_len > 0) 的时候却打印出r_len = -1 了呢,我从来就没遇到过这种情况!!!

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧