現在我用兩個客戶端去連接這個服務器 , 假設分別創造 conn 為 5 和 6 。 那么此時我在 conn 為 6 的客戶端上輸入資料后,在服務端 select 后 并沒有把 5在 集合中置為0 ,所以之后一直會卡在 5 中的readline ,正常來說集合中只會有 6 ,其他都會置為0 ,但我這個 5 也會存在 ,這是為什么 ?????
while (1) {
rset = allset;
printf("wait........\n");
nready = select(maxfd + 1, &rset, NULL, NULL, NULL); //nready就是收到了幾個關注事件
if (nready == -1) {
if (errno == EINTR)
continue;
ERR_EXIT("select");
}
if (nready == 0)
continue;
if (FD_ISSET(listenfd, &rset)) {
peerlen = sizeof(peeraddr);
conn = accept(listenfd, (struct sockaddr*)&peeraddr, &peerlen);
printf("conn==%d\n", conn);
if (conn == -1)
ERR_EXIT("accept");
for (i = 0; i < FD_SETSIZE; i++) { //找到一個空的位置去防止conn
if (client[i] == -1) {
client[i] = conn;
if (i > maxi)
maxi = i;
break;
}
}
if (i == FD_SETSIZE) { //找不到空的位置去防止conn
fprintf(stderr, "too many clients");
exit(EXIT_FAILURE);
}
printf("ip=%s port=%d\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));
FD_SET(conn, &allset);
if (conn > maxfd)
maxfd = conn;
if (--nready <= 0) //如果事件數==0了,那就直接回傳
printf("duqujieshu\n");
continue;
}
for (i = 0; i <= maxi; i++) {
conn = client[i];
if (conn == -1)
continue;
if (FD_ISSET(conn, &rset)); //在集合中,那肯定產生了資料
{
printf("conn=%d\n", conn);
char recvbuf[1024] = { 0 };
memset(recvbuf, 0, sizeof(recvbuf));
int ret = readline(conn, recvbuf, 1024); //現在的問題是,如果我開了兩個客戶端,比如說他們的conn是5和6 ,那么如果我在客戶端6發送資料時,因為順序的緣故,會先進入5 ,然后一直卡在讀取5的輸入緩沖區中
if (ret == -1)
ERR_EXIT("readline");
if (ret == 0)
{
printf("client close\n");
client[i] = -1;
FD_CLR(conn, &allset);
}
fputs(recvbuf, stdout);
writen(conn, recvbuf, strlen(recvbuf));
if (--nready <= 0)
break;
}
}
}
uj5u.com熱心網友回復:
這什么網路編程,是5連接沒釋放?uj5u.com熱心網友回復:
就是select函式nready = select(maxfd + 1, &rset, NULL, NULL, NULL);
nready 回傳我關注的檔案描述符的個數
首先現在是 2 個客戶端連接 -----5和6
如果我在 客戶端6 寫入資料
那么應該通過套介面被select 接受到
此時 select 結束阻塞
nready 回傳1
但是此時我的rset 中 不是應該只有 6 么
但是當conn = 5
FD_ISSET(conn, &rset) 也可以成功
但正常來說不是應該失敗的么
只有FD_ISSET(6, &rset) 才能成功么
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/283608.html
標籤:專題技術討論區
