[爆卦]fd_set用法是什麼?優點缺點精華區懶人包

為什麼這篇fd_set用法鄉民發文收入到精華區:因為在fd_set用法這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者rmp4aup6 (嘿嘿)看板C_and_CPP標題Re: [問題] socket select...


※ 引述《rmp4aup6 (嘿嘿)》之銘言:
: 各位先進您們好,
: 有個問題想請教您們一下,
: 關於select的用法,
: 為什麼在宣告的時候,
: 會有兩個fd_set,一個為master fd list,
: 另一個為temp fd list,
: 到while loop內還有多個步驟,
: 把master copy到temp,
: 為什麼不能直接宣告一個master,
: 之後若有新個client connect,
: 直接add到master內呢?

我直接把我的code po出來好了,

int fdmax;
FD_ZERO(&readfds);
FD_ZERO(&masterfds);
FD_SET(serverfd, &masterfds);
//FD_SET(serverfd, &readfds);
fdmax = serverfd;

while(1)
{
readfds = masterfds;

int fd;
printf("server waiting...\n");

if((result = select(fdmax+1, &readfds, NULL, NULL, NULL)) < 0)
{
perror("select failed");
exit(1);
}
/* check which fd */
for (fd=0; fd <= fdmax; fd++)
{
if(FD_ISSET(fd, &readfds))
{
/* new connection from client */
if(fd == serverfd)
{
if((clientfd = accept(serverfd, (struct sockaddr *)&client_address, &address_len)) < 0)
{
perror("accept error");
exit(1);
}
FD_SET(clientfd, &masterfds);
//FD_SET(clientfd, &readfds);
printf("adding clientfd = %d\n", clientfd);
if(clientfd > fdmax)
{
fdmax = clientfd;

}
}
/* receive message from old client */
else
{
memset(&message, 0, sizeof(message));
if((result = recv(fd, &message, 1024, 0)) <= 0)
{
if(result == 0)
{
printf("remove clientfd = %d\n", fd);
}
else
{
perror("receive");
}
close(fd);
FD_CLR(fd, &masterfds);
//FD_CLR(fd, &readfds);

}
else
{
printf("receive message: %s", message);
send(fd, feedback, strlen(feedback), 0);
}
}

我想問的就是,

為什麼我不能只用readfds這個fd set就好,

不論新加入連線或離開的的client,都對readfds作ser或clear呢?

我有試過,

這樣會有一個問題,

原本已連線的client,

若send message到server,

server會不知道已有readfds可讀的情形發生,

請問這是什麼原因呢?

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.250.40.175
ccpz:man page: http://goo.gl/x7g6v 06/12 09:53
ccpz:On exit, the sets are modified in place to indicate 06/12 09:54
ccpz:which file descriptors actually changed status 06/12 09:54
ccpz:select 會改 fd_set 06/12 09:54
ccpz:也可以看stackoverflow的說明: http://goo.gl/ND3SQ 06/12 09:55

你可能也想看看

搜尋相關網站