為什麼這篇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