当前位置: 技术问答>linux和unix
select函数不起作用
来源: 互联网 发布时间:2017-02-19
本文导语: 主体架构都基本正确(以前使用两个while死循环,能正确传送),现在该成一个while死循环加select函数遇到以下情况: 注:因为传送的文件比较大,所以需要多次接收和发送。连接一次后,用while循环实现...
主体架构都基本正确(以前使用两个while死循环,能正确传送),现在该成一个while死循环加select函数遇到以下情况:
注:因为传送的文件比较大,所以需要多次接收和发送。连接一次后,用while循环实现,不需要每次传接都连接。
1,当时间设为“0”和NULL时,可以收到并发送1个包,服务器第二次收发时,好像就卡在select函数一样,既不返回错,也不继续往下执行(此时客户端还是使用的两个死循环,它显示发给服务器端的第2个数据包已正确发送),
2,当时间设定为2.5S时,可以收到并发送1个包,服务器第二次收发时,select函数的返回值一直为0,一直循环判断select函数(此时客户端还是使用的两个死循环,它显示发给服务器端的第2个数据包已正确发送),
如果此时如果将select返回0的情况注释掉,可以连续的传接数据,知道文件完,但是,每次收发数据都必须等到设定的时间过了之后才行,相当于sleep了设定的秒数。
//服务器程序
int main()
{
...............................
while(1)
{
FD_ZERO(&rset);
FD_ZERO(&wset);
FD_SET(ser_sockfd,&rset);
FD_SET(ser_sockfd,&wset);
maxfd=ser_sockfd+1;
// timeout.tv_sec=2;
// timeout.tv_usec=500000;
for(cyc=0;cyc
注:因为传送的文件比较大,所以需要多次接收和发送。连接一次后,用while循环实现,不需要每次传接都连接。
1,当时间设为“0”和NULL时,可以收到并发送1个包,服务器第二次收发时,好像就卡在select函数一样,既不返回错,也不继续往下执行(此时客户端还是使用的两个死循环,它显示发给服务器端的第2个数据包已正确发送),
2,当时间设定为2.5S时,可以收到并发送1个包,服务器第二次收发时,select函数的返回值一直为0,一直循环判断select函数(此时客户端还是使用的两个死循环,它显示发给服务器端的第2个数据包已正确发送),
如果此时如果将select返回0的情况注释掉,可以连续的传接数据,知道文件完,但是,每次收发数据都必须等到设定的时间过了之后才行,相当于sleep了设定的秒数。
//服务器程序
int main()
{
...............................
while(1)
{
FD_ZERO(&rset);
FD_ZERO(&wset);
FD_SET(ser_sockfd,&rset);
FD_SET(ser_sockfd,&wset);
maxfd=ser_sockfd+1;
// timeout.tv_sec=2;
// timeout.tv_usec=500000;
for(cyc=0;cyc