【问题标题】:Listen on a UDP socket while also receiving input from stdin with C侦听 UDP 套接字,同时使用 C 接收来自标准输入的输入
【发布时间】:2025-11-27 22:35:02
【问题描述】:

所以我正在尝试用 C 语言编写一个程序,该程序可以通过 UDP 从另一台计算机接收数据包,同时还能够在有人在命令行中输入“退出”时停止监听。我的问题是 fgets 和 recvfrom 都等到发生了一些事情,所以如果我当前正在执行 fgets 我的程序将忽略传入的消息,如果我当前正在等待消息,它将忽略终端的输入。有什么办法可以同时做这两件事吗?

相关代码:

while (strcmp(sendline, "quit")!=0) {

    fgets(sendline,MAXLINE,stdin);

    if((nbytes=recvfrom(sd,recvline,1+strlen(sendline),0,
        (struct sockaddr*)&sad, &fromlen))<0){
      perror("recvfrom");
      exit(1);
    }  
}

【问题讨论】:

  • 你考虑过2个线程吗?

标签: c sockets udp udpclient fgetc


【解决方案1】:

如果您切换到使用低级 IO(从 fd 0 读取而不是从 stdin 读取),则可以使用 select() 函数在 fd 或套接字上准备好数据时收到通知。

【讨论】:

  • 注意,这可能会在某种程度上牺牲兼容性。 (您可能无法使用readwrite 套接字,或select 文件描述符。尤其是在Windows 中。)
  • 在 windows 上,它会是一个更低级别的 IO(HANDLE 而不是文件描述符,尽管从正确的 HANDLE 类型生成 fd 很容易 - 包括文件和控制台输入句柄)和然后 select 将对两者都起作用。 Windows 上的真正问题是,几乎总是有比 select() 更好的选择。
  • 所以我尝试使用 poll 而不是 select,因为据我所知,它只是 select 的一个更好的版本。但是,我无法读取()套接字。我正在使用 Linux。 HANDLE 能解决这个问题吗?