社区
Linux/Unix社区
帖子详情
[网络编程] recv 接收错误,提示errno=84 或 22
小菜_默
2011-10-27 11:06:29
各位大哥好,我现在遇到的问题是recv接收数据时提示 (84)Invalid or incomplete multibyte or wide character或者是(22)Invalid argument 我很无解,从网上也没找到合适的答案,不知道有人遇到没?怎么解决的?小菜先谢谢了~~
...全文
538
7
打赏
收藏
[网络编程] recv 接收错误,提示errno=84 或 22
各位大哥好,我现在遇到的问题是recv接收数据时提示 (84)Invalid or incomplete multibyte or wide character或者是(22)Invalid argument 我很无解,从网上也没找到合适的答案,不知道有人遇到没?怎么解决的?小菜先谢谢了~~
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
DIE654456
2011-10-28
打赏
举报
回复
291 while(RecvLen)
292 {
293
294 pthread_mutex_lock(&m_SockFDMutex);
295 if( (Len = recv(sockfd, &RecvBufe, RecvLen,0)) <= 0) //从套接口中读数据
296 {
297 pthread_mutex_unlock(&m_SockFDMutex);
298 errorvalue = errno;
299 TRACE("%d:%s\n",errno,strerror(errno));
300 DelInvalidSocket(sockfd);
301 close(sockfd);sockfd = -1;
302 return errorvalue;
303 }
304
305 pthread_mutex_unlock(&m_SockFDMutex);
306
307 RecvLen -= Len;
308 }
把while循环和recv成功后的代码改一下
291 while(RecvLen>0)
292 {
293
294 pthread_mutex_lock(&m_SockFDMutex);
295 if( (Len = recv(sockfd, (char*)&RecvBufe+ST_CONTROLINFO_LEN-RecvLen, RecvLen,0)) <= 0) //从套接口中读数据
296 {
297 pthread_mutex_unlock(&m_SockFDMutex);
298 errorvalue = errno;
299 TRACE("%d:%s\n",errno,strerror(errno));
300 DelInvalidSocket(sockfd);
301 close(sockfd);sockfd = -1;
302 return errorvalue;
303 }
304
305 pthread_mutex_unlock(&m_SockFDMutex);
306
307 RecvLen -= Len;
308 }
DIE654456
2011-10-27
打赏
举报
回复
把recv附近的几行代码粘贴出来看看
qq120848369
2011-10-27
打赏
举报
回复
[Quote=引用 5 楼 lvyinghong 的回复:]
按你这写法,最可能 RecvLen 已经是负数了还传给 那个recv了,或者大于实际的缓冲长度了
291 while(RecvLen)
292 {
293
294 pthread_mutex_lock(&m_SockFDMutex);
295 if( (Len = recv(sockfd, &RecvBufe, RecvLen,0)) <= 0) //从……
[/Quote]
楼主的代码可能后来变化了,不用char[]接受了,改成结构体干XXXYYY的。
lvyinghong
2011-10-27
打赏
举报
回复
按你这写法,最可能 RecvLen 已经是负数了还传给 那个recv了,或者大于实际的缓冲长度了
291 while(RecvLen)
292 {
293
294 pthread_mutex_lock(&m_SockFDMutex);
295 if( (Len = recv(sockfd, &RecvBufe, RecvLen,0)) <= 0) //从套接口中读数据
296 {
297 pthread_mutex_unlock(&m_SockFDMutex);
298 errorvalue = errno;
299 TRACE("%d:%s\n",errno,strerror(errno));
300 DelInvalidSocket(sockfd);
301 close(sockfd);sockfd = -1;
302 return errorvalue;
303 }
304
305 pthread_mutex_unlock(&m_SockFDMutex);
306
307 RecvLen -= Len; 这个每次都减, recv 返回-1的时候,这个还作,肯定最后结构不对。
308 }
顺便说一下 RecvBufe 的 buffer 写错了。
还有一个问题就是你的每次都传的RecvBufe 的给 recv,后面那个回覆盖前面的数据,明显不是你期望的结构。
要用 (RecvBufe + RecvLen)才对吧。
小菜_默
2011-10-27
打赏
举报
回复
[Quote=引用 3 楼 qq120848369 的回复:]
多线程程序,楼主先判断一下sockfd是否大于0,然后有一句话虽然不会影响,但从语法含义上不和谐:
if( (Len = recv(sockfd, &RecvBufe, RecvLen,0)) <= 0)
改成:
if( (Len = recv(sockfd, RecvBufe, RecvLen,0)) <= 0)
[/Quote]
sockfd应该不为空的,还有 那个,RecvBufe 应该是有&符号的吧,,因为我那个RecvBufe是个结构体的~~
qq120848369
2011-10-27
打赏
举报
回复
多线程程序,楼主先判断一下sockfd是否大于0,然后有一句话虽然不会影响,但从语法含义上不和谐:
if( (Len = recv(sockfd, &RecvBufe, RecvLen,0)) <= 0)
改成:
if( (Len = recv(sockfd, RecvBufe, RecvLen,0)) <= 0)
小菜_默
2011-10-27
打赏
举报
回复
[Quote=引用 1 楼 die654456 的回复:]
把recv附近的几行代码粘贴出来看看
[/Quote]
int CSockRecvMsg(int sockfd)
284 {
285 int errorvalue = 0;
286 ST_CONTROL_INFO RecvBufe = {};
287 //char RecvBufe[ST_CONTROLINFO_LEN] = "";
288 int Len = 0;
289 int RecvLen = ST_CONTROLINFO_LEN;
290
291 while(RecvLen)
292 {
293
294 pthread_mutex_lock(&m_SockFDMutex);
295 if( (Len = recv(sockfd, &RecvBufe, RecvLen,0)) <= 0) //从套接口中读数据
296 {
297 pthread_mutex_unlock(&m_SockFDMutex);
298 errorvalue = errno;
299 TRACE("%d:%s\n",errno,strerror(errno));
300 DelInvalidSocket(sockfd);
301 close(sockfd);sockfd = -1;
302 return errorvalue;
303 }
304
305 pthread_mutex_unlock(&m_SockFDMutex);
306
307 RecvLen -= Len;
308 }
309
312 return errorvalue;
313 }
recv
函数和send函数返回值
错误
处理
本文中分析的都是非阻塞态的socket
错误
代码,因为阻塞态也不会出现EWOULDBLOCK
错误
。 1、
recv
函数: 返回值<0时并且(
errno
==EINTR||
errno
==EWOULDBLOCK||
errno
==EAGAIN)的情况下认为连接是正常的,继续
接收
。 当socket设置为非阻塞的时候,
recv
返回
错误
时才会有
errno
==EWOULDBLOCK||
errno
==EAGAIN两种情况; #define EWOULDBLOCK EAGAIN......
Linux
网络编程
:
recv
的返回值
recv
是
网络编程
中用于TCP传输
接收
数据的接口,由于工作中一直没有接触到
网络编程
,虽然知道这个函数,但是没有使用经验,所有对接口细节不是很了解。 直到前阵子在项目中调试第三方的源码时,跟踪到这个函数,才发现它的返回值和我想象的不太一样。
recv
函数的原型: ssize_t
recv
(int sockfd, void* buf, size_t len, int flags); 之前知道的是如果读取成功,会返回实际读取到的字节数,但是如果读取不到数据呢?一直想当然的认为会返回0,其实并不是,当读取不到数据
Linux
recv
返回-1
errno
=ETIMEDOUT(Connection timed out)
关于
errno
值的定义在
errno
.h中 [cpp:nogutter] view plaincopy #ifndef _I386_
ERRNO
_H #define _I386_
ERRNO
_H #define EPERM 1 /* Operation not permitted */ #define ENOENT
Linux
网络编程
之
recv
函数
返回值为-1,并且 (
errno
== EINTR ||
errno
== EWOULDBLOCK ||
errno
== EAGAIN) 的情况下认为连接是正常的,继续
接收
。
奇怪的
recv
函数
一直有个错觉,以为
recv
的函数返回值>0是有数据读到,=0是无数据, 从下文才知道,即使前面select read句柄返回大于0,
recv
函数返回0竟然是代表连接关闭。而且
recv
返回小于0也不一定是出错,而根据
errno
判断还有可能只是没有读到数据~!!!! 1、阻塞模式与非阻塞模式下
recv
的返回值各代表什么意思?有没有区别?(就 我目前了解阻塞与非阻塞
recv
返回
Linux/Unix社区
23,120
社区成员
74,507
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章