当前位置: 技术问答>linux和unix
多客户端Socket的select问题,高手帮忙!
来源: 互联网 发布时间:2015-12-22
本文导语: 一个服务器和多个客户端建立连接,也就是将accept()返回的Socket保存在一个数组中,然后对这多个连接调用select。判断某个客户端送来数据,如果有则读出。 我的问题: 1.是否可以多次调用FD_SET,将accept()返回的多...
一个服务器和多个客户端建立连接,也就是将accept()返回的Socket保存在一个数组中,然后对这多个连接调用select。判断某个客户端送来数据,如果有则读出。
我的问题:
1.是否可以多次调用FD_SET,将accept()返回的多个Socket放入集合。
2.如果可以,当某个Socket可读时,怎样根据select 返回的结果判断是哪个socket 可读?
请高手给个算法,谢谢。
我的问题:
1.是否可以多次调用FD_SET,将accept()返回的多个Socket放入集合。
2.如果可以,当某个Socket可读时,怎样根据select 返回的结果判断是哪个socket 可读?
请高手给个算法,谢谢。
|
1) FD_SET可以多此调用阿,有一个fd,就需要调用一次
2) 用FD_ISSET, 这个宏来确定是遍历每个fd,确认是否这个fd可以读写了,直接知道哪些fd可以读是不能知道的,只能遍历来获得
2) 用FD_ISSET, 这个宏来确定是遍历每个fd,确认是否这个fd可以读写了,直接知道哪些fd可以读是不能知道的,只能遍历来获得
|
*----------------------源代码开始--------------------------------------------*/
static int forward_port;
#undef max
#define max(x,y) ((x) > (y) ? (x) : (y))
static int listen_socket (int listen_port) {
struct sockaddr_in a;
int s;
int yes;
if ((s = socket (AF_INET, SOCK_STREAM, 0)) 0) {
FD_SET (fd2, &wr);
nfds = max (nfds, fd2);
}
/*把有异常数据的socket两个一起放入select的异常句柄列表里*/
if (fd1 > 0) {
FD_SET (fd1, &er);
nfds = max (nfds, fd1);
}
if (fd2 > 0) {
FD_SET (fd2, &er);
nfds = max (nfds, fd2);
}
/*开始select*/
r = select (nfds + 1, &rd, &wr, &er, NULL);
if (r == -1 && errno == EINTR) continue;
if (r
static int forward_port;
#undef max
#define max(x,y) ((x) > (y) ? (x) : (y))
static int listen_socket (int listen_port) {
struct sockaddr_in a;
int s;
int yes;
if ((s = socket (AF_INET, SOCK_STREAM, 0)) 0) {
FD_SET (fd2, &wr);
nfds = max (nfds, fd2);
}
/*把有异常数据的socket两个一起放入select的异常句柄列表里*/
if (fd1 > 0) {
FD_SET (fd1, &er);
nfds = max (nfds, fd1);
}
if (fd2 > 0) {
FD_SET (fd2, &er);
nfds = max (nfds, fd2);
}
/*开始select*/
r = select (nfds + 1, &rd, &wr, &er, NULL);
if (r == -1 && errno == EINTR) continue;
if (r