两个客户端之间的异步传输消息

时间:2011-12-02 15:23:25

标签: c client message transfer

这次我编写聊天服务器和客户端代码。这个想法是这样的。

服务器使用select方法和readfd(FD_SET)来查找连接在其上的哪些客户端要发送的内容。如果它发现某些东西,它会发送给其他客户。

这是服务器上的select函数和服务器code的一部分。

SelectResults = select(maxDescriptor+1,&BackUpfdread,NULL,NULL,&time);

我也在客户端中使用select函数,使其寻找传入和传出消息。(服务器从其他客户端发送这些客户端以及此客户端想要发送的消息)。

嗯,select函数中的客户端有一个fdread和fdwrite(FD_SET)。

Here是客户端用于连接和聊天的代码的一部分。

问题是,如果我在服务器上连接两个客户端,则邮件传输不是并发的,这意味着客户端无法正确聊天。

最后我想在服务器中使用线程。一个用于等待接收的线程和一个用于发送给客户端的线程,但我希望听到您的意见。

1 个答案:

答案 0 :(得分:0)

在客户端中,您不需要从0到maxDescriptor的循环。只需检查是否设置了ConnectSocket。像这样:

// Main loop starts here
for(; ;)
{
  memset(SentBuff, 0, sizeof(SentBuff));
  printf("Write: ");
  gets_s(SentBuff, sizeof(SentBuff));

  // Copy the fdread into BackUpfdread and fdwrite to BackUpfdwrite.
  BackUpfdread = fdread;
  BackUpfdwrite = fdwrite;

  SelectResults = select(maxDescriptor+1,&BackUpfdread,&BackUpfdwrite,NULL,&timer);

  if(SelectResults == -1)
  {
    perror("Client-select() error!\n");
    exit(1);
  }

  if (FD_ISSET(ConnectSocket, &BackUpfdread))
  {
    RecvBytes = recv(ConnectSocket, RecvBuff, sizeof(RecvBuff), 0);
    if(RecvBytes > 0)
    {
      printf("%s\n",RecvBuff);
      // Cleaning the Receive Buffer
      memset(RecvBuff,0,sizeof(RecvBuff));
    }
  }

  if (FD_ISSET(ConnectSocket, &BackUpfdwrite))
  {
    SentBytes = send(ConnectSocket, SentBuff,sizeof(SentBuff),0);
    // Cleaning the Sent Buffer
    memset(SentBuff,0,sizeof(SentBuff));
  }
} // Main loop ends here

另外,请不要忘记检查来自sendrecv的错误。特别是recv很重要,因为它会告诉您服务器已断开连接。

编辑:另一个需要注意的重要事项是,套接字可能始终可写,因此在检查套接字是否可写之前,请检查是否有要写的内容。