【问题标题】:client/server architecture with multiple clients具有多个客户端的客户端/服务器架构
【发布时间】:2012-02-03 23:29:55
【问题描述】:

我需要在 C 中实现一个服务器/客户端代码。 服务器需要能够同时接受四个连接。
我无法让这个工作。到目前为止我做了什么:
1. 创建一个套接字
2.设置为非阻塞:fcntl(sock,F_SETFL, O_NONBLOCK);
3.绑定它
4.收听:listen(sock, 4);

我不太确定的部分是如何接受客户端的连接。我的代码如下所示:

while (1) {
   if ((sockfd = accept(sock, (struct sockaddr *) &client_addr,  &client_size)) < 0) {
            perror("Error\n");
   }
   read(sockfd, &number, sizeof(number));
   write(sockfd, &number, sizeof(number));
}

当我执行客户端和服务器代码时,客户端似乎正在向套接字写入一些东西,而服务器从未接收到该套接字并且整个执行都阻塞了。 接受来自多个客户端的连接的正确方法是什么?

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    这种服务器的一个基本工作流程,如果你不想使用多线程,是这样的:

    • 创建一个fd_set 文件描述符以监视读取
    • 打开一个套接字
    • 将套接字绑定到要监听的端口
    • 开始监听套接字
    • 将套接字的文件描述符添加到fd_set
    • 尚未完成
      • 使用select 等待套接字准备好从中读取
      • 循环浏览您的 fd_set 中的 fds,其中有可用的数据
      • 如果当前 fd 是您的侦听套接字,则接受新连接
      • 否则,它是客户端 fd。读取它,也许还写回它。

    This page 显示了上述过程的流程图。 (向下滚动查看一个注释很好的示例。)

    This page 充满了select 的示例。

    【讨论】:

    • 非常感谢您的详细解释。我终于让它工作了!!
    【解决方案2】:

    你应该看起来像select 的人。它会告诉您何时以及哪些套接字准备好写入/读取

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多