【问题标题】:Asynchronous transfer message between two clients两个客户端之间的异步传输消息
【发布时间】:2011-12-02 15:23:25
【问题描述】:

这次我编写了一个聊天服务器和客户端。思路是这样的。

服务器使用 readfd(FD_SET) 的 select 方法来查找与其连接的哪些客户端有要发送的内容。如果它发现了什么,它会将其发送给其他客户端。

这是服务器上的选择功能和服务器code的一部分。

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

我也在客户端中使用 select 功能,让它寻找传入和传出的消息。(这些是服务器从其他客户端发送的,而这些是这个客户端想要发送的)。

好吧,客户端在select函数里有一个fdread和fdwrite(FD_SET)。

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

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

最后我想在服务器中使用线程。一个线程等待接收,一个线程发送给客户,但我想听听你的意见。

【问题讨论】:

  • 您是否使服务器中的侦听和客户端套接字非阻塞?
  • 对不起,我无法理解你的问题。
  • 它可能与套接字的阻塞或非阻塞状态无关(使用谷歌搜索找出它的含义),但如果我正确理解你的问题,你的服务器在只有一个时工作客户端已连接但在连接两个客户端时不起作用?那么这是服务器而不是客户端的问题。您能否编辑您的问题以包含一些相关的服务器代码(例如您如何调用selectaccept,以及您如何从客户端读取数据并将数据发送到客户端)?
  • 服务器始终工作。与一个或多个客户。问题是客户没有按时收到消息。好的,我编辑了上面的帖子。感谢您的宝贵时间。

标签: c client message transfer


【解决方案1】:

在客户端中,您实际上并不需要从 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 很重要,因为它会告诉您服务器已断开连接。

编辑:另一个需要注意的重要事情是,套接字可能始终是可写的,所以在检查套接字是否可写之前添加一个检查是否有要写的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2019-09-09
    • 2019-04-08
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多