2012-10-27 48 views
0

我正在聊天服務器和客戶端使用tcp/ip在c。我製作了多個客戶端的服務器部分。在客戶端,我有一個while循環可以發送一行,然後等待服務器回覆。我想讓客戶端輪詢send和recv函數來檢查另一個客戶端是否發送了一些東西。這就是我 -TCP/IP輪詢客戶端發送和recv在c

while (1){ 
    char buffer[BUFLEN]; 
    memset(buffer, 0, sizeof buffer); 
    gets(buffer); 
    //sendall(sd, buffer, BUFLEN); 
    send(sd, buffer, BUFLEN, 0); 
    printf("sent:%s\n",buffer); 
    //recvline(sd, buffer, BUFLEN); 
    recv(sd, buffer, BUFLEN, 0); 
    printf("recieved:%s\n", buffer); 
} 

如何查詢在同一時間同時發送()和recv()和執行至上的一個?

想要做這樣的事情..

if(send(sd, buffer, BUFLEN, 0) == true) 
    send something 
else if(recv(sd, buffer, BUFLEN, 0) == true) 
    receive something 
+2

您可能正在尋找['select()'](http://linux.die.net/man/2/select)函數來*讀取和寫入文件描述符之間的* multiplex *。 – chrisaycock

+0

這將如何工作?你可以解釋嗎? – fatrock92

+1

不要假設send()或recv()處理你在第3個參數中給出的字符數;改用返回值。 – wildplasser

回答

2

我相信你正在尋找的東西像selectMSDN Pageman page)。是

使用它的基本如下:

  • 加載了fd_set結構與插座處理要檢查。將一個fd_set加載到要檢查要接收的新數據的套接字中,其中一個套接字要發送,另一套套接字(可選)要檢查錯誤的套接字。

  • 致電select,將它指向您的fd_set結構。

  • select返回時,您作爲第二個參數(readfds)傳遞的設置僅包含您傳遞的具有數據等待的套接字。您可以撥打recv,並立即返回。您作爲第三個參數(writefds)傳遞的集合包含可供寫入的套接字。您可以撥打send,並立即返回。

+0

選擇是可怕的。平臺現在提供了更好的機制。例如,kqueue,epoll等。如果你打算給平臺無關的答案,最好的辦法可能是推薦一個類似'libevent'的圖書館...... – 2012-10-28 00:04:50

+0

這是正確的。有很好的機制,選擇不是其中之一。是的,'select'會起作用,但今天推薦'選擇'就像推薦Flintstones移動到正在尋找蘭博基尼的人。 – 2012-10-28 00:07:19

+1

我不同意,選擇或輪詢沒有任何問題。 *有平臺*:請詳細說明。 – wildplasser