读书人

Linux c socket 数据读取丢掉

发布时间: 2013-07-04 11:45:55 作者: rapoo

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 是不会自动再组包的.

读书人网 >C语言

热点推荐