【问题标题】:TCP/IP polling client send and recv in cTCP/IP 轮询客户端在 c 中发送和接收
【发布时间】:2012-10-17 19:04:38
【问题描述】:

我正在使用 c 中的 tcp/ip 创建聊天服务器和客户端。我制作了线程多个客户端的服务器部分。在客户端,我有一个 while 循环,可以发送一行,然后等待服务器回复。我想让客户端轮询发送和接收函数,以检查另一个客户端是否发送了一些东西。这就是我所拥有的-

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);
}

如何同时轮询 send() 和 recv() 并执行第一个来的??

想做这样的事情..

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

【问题讨论】:

  • 您可能正在寻找 select() 函数以在读取和写入文件描述符之间复用
  • 这将如何工作?你能解释一下吗?
  • 不要假设 send() 或 recv() 来处理你在第三个参数中给他们的字符数;改用返回值。
  • 关于select()-based services 检查那里。 (以及其他一百万个地方)

标签: c unix networking tcp chat


【解决方案1】:

我相信您正在寻找类似select (MSDN Page, man page) 的东西。

基本使用方法如下:

  • 使用您要检查的套接字句柄加载 fd_set 结构。加载一个fd_set 与您想要检查新数据接收的套接字,一个与您想要发送的套接字,以及一个可选的,与您想要检查错误的套接字。

  • 调用select,将指针传递给您的fd_set 结构。

  • select 返回时,您作为第二个参数(readfds)传递的集合仅包含您传递给它的等待数据的套接字。你可以给他们打电话recv,它会立即返回。您作为第三个参数 (writefds) 传递的集合包含准备写入的套接字。你可以给他们打电话send,它会立即返回。

【讨论】:

  • 选择很糟糕。如今,平台提供了更好的机制。例如,kqueue、epoll 等。如果你打算给出独立于平台的答案,最好的方法可能是推荐像libevent这样的库...
  • 没错。并且有很好的机制,而 select 不是其中之一。是的,select 会起作用,但今天推荐 select 就像向正在寻找兰博基尼的人推荐 Flintstones mobile。
  • 我不同意,选择或投票没有错。 有平台:请详细说明。
  • @VladLazarenko 感谢您提供的信息。由于我在该领域不是很有经验,是什么让libevent/epoll/kqueue 更快?
  • @slavik262:例如,不需要线性搜索。最重要的是,它们是操作系统原生的,因此功能工作所需的“胶水”级别更少。这些机制也更先进,支持更多功能。例如,使用 epoll 可以以一种安全可靠的方式异步处理 POSIX 信号。
猜你喜欢
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
相关资源
最近更新 更多