Re: [問題] socket select用法

看板C_and_CPP作者 (嘿嘿)時間11年前 (2013/06/11 02:28), 編輯推噓1(104)
留言5則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《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

06/12 09:53, , 1F
06/12 09:53, 1F

06/12 09:54, , 2F
On exit, the sets are modified in place to indicate
06/12 09:54, 2F

06/12 09:54, , 3F
which file descriptors actually changed status
06/12 09:54, 3F

06/12 09:54, , 4F
select 會改 fd_set
06/12 09:54, 4F

06/12 09:55, , 5F
也可以看stackoverflow的說明: http://goo.gl/ND3SQ
06/12 09:55, 5F
文章代碼(AID): #1HjXh126 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1HjXh126 (C_and_CPP)