首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

Linux c socket 数据读取丢掉

2013-07-04 
Linux c socket 数据读取丢失如题在使用read读取时,返回的数据偶尔会出现丢失的情况,正常是2520字节数据,

Linux c socket 数据读取丢失
如题
在使用read读取时,返回的数据偶尔会出现丢失的情况,正常是2520字节数据,丢失时返回1449字节
求高手将if(read(..)),改成循环读取,或者其他方式实现

char* buf = (char *) tpalloc("CARRAY", NULL, MAXDATASIZE);
if (read(sockfd, buf, MAXDATASIZE) == -1){
  exit(1);
}
close(sockfd);
tpreturn(TPSUCCESS, 0, buf, strlen(buf) + 1, 0);
Linux C socket
[解决办法]
和缓冲是否有关系,可以尝试一下封装:

ssize_t readn(int fd,void *vptr,size_t n)
{
       size_t nleft;
       ssize_t nread;
       char *ptr;
       ptr=vptr;
       nleft=n;
       while(nleft>0)
              {
              if((nread=read(fd,ptr,nleft))<0)
                     {
                     if(errno==EINTR)
                            nread=0;
                     else
                            {
                            perror("\nread");
                            return(-1);
                            }


                     }
              else if(nread==0)
                     {
                     break;
                     }
              nleft-=nread;
              ptr =nread;
              }
       return(n-nleft);
}
[解决办法]
socket,用的什么协议,tcp 和 udp 都会将信息分包的
[解决办法]
用的 TCP?
那说不定后面的 1449 字节还没传送到, 反复调用读取直到读够吧.

如果是 UDP,
这么大的数据包, 有可能被中间某个路由器切开了, UDP 是不会自动再组包的.

热点排行