我有一个问题,我使用select
函数等待我可以在服务器端读取收到的数据,但它工作错误,就像我什么也没收到,超时一样。
服务器端代码:
int fd = accept(sockfd, addr, addrlen);
if(fd > 0)
{
struct timeval tv;
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
// wait when i can read data
int ret_select = select(1, &rfds, (fd_set *) 0, (fd_set *) 0, &tv);
if(ret_select > 0)
{
// data ready to be readed. NEVER HERE!
}
else
{
// nothing. ALWAYS HERE
}
}
客户端:
int ret = connect(s, name, namelen);
if(ret == 0)
{
struct timeval tv;
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(s, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
// wait when we can write
int ret_select = select(1, (fd_set *) 0, &rfds, (fd_set *) 0, &tv);
if(ret_select > 0)
{
int sended = send(s, my_data, size_data, 0);
if(sended > 0)
{
// all ok, data sended!
}
}
}
但如果我在服务器端删除调用select
- 一切正常,要读取的数据是存在的,所以我猜select
在我的代码中工作错误了!
我的代码出了什么问题?
谢谢!
答案 0 :(得分:6)
select()
的第一个参数是不集合中的文件描述符数。它是:
nfds是三组中任何一组中编号最高的文件描述符,加上1.
因此,除非您的套接字文件描述符为数字0,否则您的参数1是错误的。