在C聊天客户端? (C网络编程)

时间:2012-04-11 06:30:45

标签: 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 );
  }
}

}

1 个答案:

答案 0 :(得分:2)

FD_ stuffs用于保存一组文件描述符,以便并行处理“等待”不同的“事件”。第一个“粗体”块用两个fd初始化集合,标准输入和套接字(可能);然后“选择”功能使程序在准备好读取时等待那些“文件”。当其中一个准备就绪时,select函数会给出后退控制,但现在你无法知道哪个“fd”已经准备就绪;所以FD_ISSET允许知道它并处理if和body中的情况(一个或两个都可以准备好)。当stdin准备好被读取时,程序从中读取然后写入sock;当sock准备好被读取时,程序将从中读取并将其读取的内容写入stdout。

换句话说,FD_内容用于I / O多路复用。