当前位置: 技术问答>linux和unix
为什么通过socket会丢数据?
来源: 互联网 发布时间:2015-03-29
本文导语: 从一个socket server的端口9990接收数据 ,数据量很大,我们客户端接收的数据老收不全,有丢报告的现象,但read和select函数都没有出错。不知什么原因? 尝试过把select的超时时间设大和不设超时,read 设成阻塞和...
从一个socket server的端口9990接收数据 ,数据量很大,我们客户端接收的数据老收不全,有丢报告的现象,但read和select函数都没有出错。不知什么原因?
尝试过把select的超时时间设大和不设超时,read 设成阻塞和非阻塞方式,但都不行,可如果手工telnet到9990端口上收报告,报告却不丢,不知什么原因?
如果不用read改用recv,应该怎么用呀?
代码如下:
while(1){
memset(buf,0x00,sizeof(buf));
FD_SET (sock,&readset);
//FD_ZERO (&readset);
select_time.tv_sec = 5;
select_time.tv_usec = 0;
rc_select = select (sock+1,&readset,NULL,NULL,&select_time);
if(rc_select == -1){/*select error*/
if(errno == EINTR) continue;
else{
log.write(LOG_DEV&LOGFILE_MASK|LOG_TIME|ERROR,
"%sselect socket reading status failed.n",
ErrLogStr);
return -1;
}
}
else if(rc_select==0){/*timeout*/
break;
}
else if(rc_select > 0){
if(FD_ISSET(sock,&readset)){/*ready for reading*/
if((rc_read=read(sock,(void *)buf,sizeof(buf)))>0){
printf("nget data here...n");
}
else if(rc_read《=){}/* ISSET */
}
} //end while 1
尝试过把select的超时时间设大和不设超时,read 设成阻塞和非阻塞方式,但都不行,可如果手工telnet到9990端口上收报告,报告却不丢,不知什么原因?
如果不用read改用recv,应该怎么用呀?
代码如下:
while(1){
memset(buf,0x00,sizeof(buf));
FD_SET (sock,&readset);
//FD_ZERO (&readset);
select_time.tv_sec = 5;
select_time.tv_usec = 0;
rc_select = select (sock+1,&readset,NULL,NULL,&select_time);
if(rc_select == -1){/*select error*/
if(errno == EINTR) continue;
else{
log.write(LOG_DEV&LOGFILE_MASK|LOG_TIME|ERROR,
"%sselect socket reading status failed.n",
ErrLogStr);
return -1;
}
}
else if(rc_select==0){/*timeout*/
break;
}
else if(rc_select > 0){
if(FD_ISSET(sock,&readset)){/*ready for reading*/
if((rc_read=read(sock,(void *)buf,sizeof(buf)))>0){
printf("nget data here...n");
}
else if(rc_read《=){}/* ISSET */
}
} //end while 1
|
把SOCKET的读写窗口和程序中的接收BUFFER改大一些试试看
|
数据量大恐怕要控制一下流量。