C 语言的聊天客户端? (C网络编程)

标签 c network-programming

有人可以向我解释一下这段代码的粗体部分在做什么吗?

     while ( 1 )
  {

    **FD_ZERO( &readfds );
    FD_SET( 0, &readfds );   /* add stdin */
    FD_SET( sock, &readfds );**

/* BLOCK on select() */
**select( FD_SETSIZE, &readfds, NULL, NULL, NULL );**

**if ( FD_ISSET( 0, &readfds ) )**
{
  char msg[1024];
  scanf( "%[^\n]", msg );  /* read everything up to the '\n' */
  getchar();  /* read (skip) the '\n' character */

  /* write the message to the socket connection */
  int n = write( sock, msg, strlen( msg ) );
  if ( n < strlen( msg ) )
  {
    perror( "write() failed" );
    return EXIT_FAILURE;
  }
}

**if ( FD_ISSET( sock, &readfds ) )**
{
  char buffer[1024];
  int n = read( sock, buffer, 1024 );
  if ( n < 1 )
  {
    perror( "read() failed" );
  }
  else
  {
    buffer[n] = '\0';
    printf( "Rcvd msg from server: %s", buffer );
  }
}

}

最佳答案

FD_ stuff 用于保留一组文件描述符,以并行处理不同“事件”的“等待”。第一个“粗体” block 用两个 fd、标准输入和套接字(可能)初始化该集合;然后“选择”函数使程序等待这些"file",当它们准备好读取时。当其中一个准备好时,select函数会交回控制权,但现在你无法知道哪个“fd”准备好了;因此 FD_ISSET 允许了解它并处理 if 主体中的情况并执行某些操作(其中之一或两者都可以准备好)。当stdin准备好被读取时,程序从中读取,然后写入sock;当 sock 准备好读取时,程序从中读取并将读取到的内容写入 stdout。

换句话来说,FD_ stuff 用于 I/O 复用。

关于C 语言的聊天客户端? (C网络编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10100986/

相关文章:

linux - 是否可以从 linux 的用户空间执行 net_enable_timestamp()?

security - Winhttp - 如果对等证书无效,则阻止成功握手

客户端与服务器建立多个连接

c - "char s[static 10]"等函数的数组参数中 static 关键字的用途是什么?

c - 解释C代码的工具

c - 验证给定的图节点列表是否是正确的拓扑顺序

windows - 如何在没有浏览器的情况下下载文件并打开/保存对话框批处理?

java - java中设备的自动网络发现

c - 如何在 EFI 图形模式下使用文本?

获取 PID 及其所有子项的 CPU 使用率的 C 程序