[网络编程] recv 接收错误,提示errno=84 或 22

小菜_默 2011-10-27 11:06:29
各位大哥好,我现在遇到的问题是recv接收数据时提示 (84)Invalid or incomplete multibyte or wide character或者是(22)Invalid argument 我很无解,从网上也没找到合适的答案,不知道有人遇到没?怎么解决的?小菜先谢谢了~~
...全文
538 7 打赏 收藏 转发到动态 举报
写回复
用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 }

23,120

社区成员

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

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