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



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

     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] = '';
    printf( "Rcvd msg from server: %s", buffer );
  }
}

}

FD_的东西用于保留一组文件描述符,以并行处理不同"事件"的"等待"。第一个"粗体"块用两个 fd、标准输入和一个套接字(可能)初始化集合;然后"选择"功能使程序等待这些"文件",当它们准备好被读取时。当其中一个准备就绪时,select 函数会返回控制权,但现在您无法知道哪个"fd"已准备就绪;因此,FD_ISSET允许知道它并处理 if 正文中的情况并做某事(一个或两个都可以准备好)。当 stdin 准备好被读取时,程序从中读取,然后写入袜子;当 Sock 准备好被读取时,程序会从中读取并将已读取的内容写入 stdout。

换个说法,FD_东西是用于I/O多路复用的。

最新更新