c - TCP/IP 轮询客户端在 c 中发送和接收

标签 c unix networking tcp chat

我正在使用 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() 和 receive() 并执行先到的那个?

想做这样的事情..

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

最佳答案

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

使用它的基础知识如下:

  • 使用要检查的套接字句柄加载 fd_set 结构。加载一个fd_set,其中包含要检查要接收的新数据的套接字,加载一个包含要发送的套接字的套接字,还可以选择加载一个包含要检查错误的套接字的fd_set

    <
  • 调用 select,将其传递给您的 fd_set 结构体。

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

关于c - TCP/IP 轮询客户端在 c 中发送和接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13105151/

相关文章:

C: ether_aton 返回类型

linux - 要求使用 grep 命令的作业,当 find 命令没问题时,我该如何编写命令?

Unix 版本号排序

c++ - 关于so​​cket编程中如何发送图片的问题?

linux - 如何在 CentOS 上扩展 ejabberd 服务器机器以处理 200 K 连接?

c - 在C编程中需要将每个3个矩阵中的3个最大数字放入1个单矩阵中

c++ - 如何将此代码重写为 sse 内在函数

c - C 中的结构。未知类型名称,

bash - 如何提取tar文件中的tar文件

bash - Vagrant 报告一个没有任何运行的端口冲突