为什么通过socket会丢数据?
从一个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
...全文
相关推荐
QTcpSocket readyread不触发或者只触发几次,readAll()丢数据,收不全数据的原因及解决办法
QTcpSocket readyread不触发或者只触发几次,readAll()丢数据,收不全数据的原因及解决办法 QT开发经常发生socket的readyread只触发几次,怍不全数据,丢包丢数据的现象,网上有一堆解释和解决方案,比如waitForReadyRead()就好了,设置接收缓冲区SndBuf就好了之类的,但是却不管用,仍然是收不全数据. 本人的解决办法,绝对管用,奉上.
你真的会用socket UDP吗? UDP丢包得厉害,怎么解决? 我先给你讲UDP的理论,再告诉你解决办法,省得直接告诉你答案反而说太短
你真的会用socket UDP吗? UDP丢包得厉害,怎么解决? 我先给你讲UDP的理论,再告诉你解决办法,省得直接告诉你答案反而说太短
JAVA socket收发数据,并支持断网自动连接
实现socket客户端收发数据,并支持客户端断网或服务器重启后重连
C# 使用Socket发送和接收TCP数据
C# 使用Socket发送和接收TCP数据,包含客户端和服务器端,发送Send,监听Listen ,C#运行环境VS2010
liunx下使用socket实现can总线数据接收
liunx下使用socket实现can总线数据接收,可以用来参考,还没有readme


