c - 套接字的文件描述符不起作用

标签 c sockets

这是我正在使用的代码。每当我向 Stdin 写入内容时,它都有效,但不适用于套接字。它无法进入套接字循环。我是套接字编程的新手。

void HandleConnection(int socket)
{
  fd_set rfd;
  struct timeval tv;
  int retval;

  printf("%d",socket);
  MakeNonBlocking(socket);

  /* Watch stdin (fd 0) to see when it has input. */
  FD_ZERO(&rfd);

  while(1)
  {
    FD_SET(STDIN, &rfd);
    FD_SET(socket, &rfd);

    /* Wait up to five seconds. */
    tv.tv_sec = 50;
    tv.tv_usec = 0;

    retval = select(2, &rfd,NULL, NULL, &tv);
    if(retval == 0)
    {
        printf("No data within fifty seconds.\n");
        exit(1);
    }
    if(FD_ISSET(socket,&rfd))
    {
        printf("socket wala\n");
        recieve_message(&socket);
        send_message(&socket);
    }
    if(FD_ISSET(STDIN,&rfd))
    {
        printf("stdin wala\n");
        recieve_message(&socket);
        send_message(&socket);
    }
  }
}

最佳答案

  1. FDZERO 必须在循环内的 FDSET 之前
  2. select(2, ...) 应该是 select(highest filedescriptor +1, ...)。
  3. 当 select 返回时,您应该检查负值以防出现错误
  4. 您应该考虑使用 pselect 而不是 select。
  5. 在重新初始化之前清除电视。

关于c - 套接字的文件描述符不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16506522/

相关文章:

c - 如果输入高于阈值,则定期调用函数的算法。需要帮助

c - 选择无限期地等待

javascript - NodeJS 套接字数据拆分

Java 信使套接字

android - 是否可以在 Android Webview 中允许 Flash Socket Client?

c - 'C' - 如何用 32 位浮点值初始化 32 位整数值?

c - 我应该如何使用 libpng 库将 RGBA 位图转换为 PNG 并将 PNG 转换回 RGBA 位图

c - 卡住时间以获得相同的随机结果

c - TCP 上的可变长度消息

c - 为什么recvfrom在UDP消息上存储0.0.0.0的IP地址?