社区
Linux/Unix社区
帖子详情
[网络编程] recv 接收错误,提示errno=84 或 22
小菜_默
2011-10-27 11:06:29
各位大哥好,我现在遇到的问题是recv接收数据时提示 (84)Invalid or incomplete multibyte or wide character或者是(22)Invalid argument 我很无解,从网上也没找到合适的答案,不知道有人遇到没?怎么解决的?小菜先谢谢了~~
...全文
687
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
返回-1后
errno
和WSAGetLastError的
错误
处理
首先
errno
函数是linux系统里面的,windows系统对应的要用WSAGetLastError函数。 官方详解如下链接:https://msdn.microsoft.com/zh-cn/windows/ms737828(v=vs.95) Error codes set by Windows Sockets are not made available throug...
Linux
网络编程
之
recv
函数
返回值为-1,并且 (
errno
== EINTR ||
errno
== EWOULDBLOCK ||
errno
== EAGAIN) 的情况下认为连接是正常的,继续
接收
。
recv
非阻塞
接收
的处理
recv
非阻塞
接收
,
recv
返回的ret通常有3种情况,ret = 0 / ret < 0(即-1) /ret > 0 ret > 0 是正常
接收
到字节数 关键是ret == 0 和 ret == -1这两种情况要不要分开写还是统一考虑 需要说明的是,当ret = -1时,说明发生了
错误
,
错误
号保存在
errno
中,通过
errno
可以分析出
错误
原因。但是,对于
errno
为EAGAIN (EWOULDBLOCK) 和 EINTR 的这两个情况,是不需要处理的,继续调用
recv
。除了这两种情况的
【博客277】socket编程常见
errno
错误
内容: 记录
网络编程
常见的
errno
错误
EAGAIN (Try again ) : 在读数据的时候,没有数据在底层缓冲的时候会遇到.比如我们epoll使用边缘 触发的时候,是需要在每次事件轮回中处理所有的消息,因为不然就得等下一次事件轮回才能处理了,因此 我们基本用边缘跟非阻塞fd一起使用,然后通过判断返回值-1时,
errno
为EAGAIN来判断已经读完了 EWOULDBLOCK (Operation would block) : 有的系统是EWOULDBLOCK,而不是EAGAIN EPIPE(Br
网络编程
之epoll怎么判断数据读取完毕?
只有在使用epoll ET(Edge Trigger)模式的时候,才需要关注数据是否读取完毕了。使用select或者epoll的LT模式,其实根本不用关注数据是否读完了,select/epoll检测到有数据可读去读就OK了。 之前写过几篇关于
网络编程
的文章,c++之
网络编程
,c++之
网络编程
–文件传输,QT之TCP
网络编程
,QT之
网络编程
-文件传输,可以参考一下。 epoll怎么判断数据读取完...
Linux/Unix社区
23,223
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章