2012-04-11 55 views
-1

有人可以向我解釋這段代碼的粗體部分在做什麼?C聊天客戶端? (C網絡編程)

 while (1) 
    { 

    **FD_ZERO(&readfds); 
    FD_SET(0, &readfds); /* add stdin */ 
    FD_SET(sock, &readfds);** 

/* BLOCK on select() */ 
**select(FD_SETSIZE, &readfds, NULL, NULL, NULL);** 

**if (FD_ISSET(0, &readfds))** 
{ 
    char msg[1024]; 
    scanf("%[^\n]", msg); /* read everything up to the '\n' */ 
    getchar(); /* read (skip) the '\n' character */ 

    /* write the message to the socket connection */ 
    int n = write(sock, msg, strlen(msg)); 
    if (n < strlen(msg)) 
    { 
    perror("write() failed"); 
    return EXIT_FAILURE; 
    } 
} 

**if (FD_ISSET(sock, &readfds))** 
{ 
    char buffer[1024]; 
    int n = read(sock, buffer, 1024); 
    if (n < 1) 
    { 
    perror("read() failed"); 
    } 
    else 
    { 
    buffer[n] = '\0'; 
    printf("Rcvd msg from server: %s", buffer); 
    } 
} 

}

+0

大膽的沒有顯示,但你可以看到他們在雙星號。有四個部分。 – Aerovistae 2012-04-11 06:31:50

+1

你讀過「man select」嗎? – Mat 2012-04-11 06:33:11

+0

好吧,打那個。雖然我不完全理解它,我有一個想法。 – Aerovistae 2012-04-11 06:33:36

回答

2

的FD_東西是用來將一組文件描述符來處理不同的「事件」「等待」並行。第一個「粗體」塊使用兩個fd(標準輸入和一個套接字(可能))初始化該集合;那麼「選擇」功能會讓程序在準備讀取時等待這些「文件」。當其中一個準備就緒時,select函數返回控制權,但現在你不知道哪個「fd」已準備好;所以FD_ISSET允許知道它並處理if和body的情況(一個或兩個都可以準備好)。當標準輸入準備好被讀取時,程序從中讀取數據,然後寫入襪子;當襪子準備好被讀取時,程序從它讀取數據並將它讀取的內容寫入標準輸出。

說得不一樣,FD_ stuffs用於I/O多路複用。