2012-10-27 33 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