【问题标题】:Accept multiple subsequent connections to socket接受到套接字的多个后续连接
【发布时间】:2011-03-22 14:28:29
【问题描述】:

我有一个监听器,可以将任意数据(HTTP 请求)传递到网络套接字,然后通过 TCP 传递。这适用于第一个请求,但侦听器不接受后续的新请求。

我的问题是:

如果我有sock=accept(listener,(struct addr *)&sin, &sinlen);,那么根据套接字函数引用,侦听器套接字保持打开状态,我应该能够为后续请求重新调用accept() 任意次数。这个对吗?如果是这样,请比我更熟悉套接字编程的人解释一下这段代码的外观吗?

【问题讨论】:

    标签: c sockets


    【解决方案1】:

    是的,您可以在监听套接字上多次accept()。要为多个客户端提供服务,您需要避免阻塞 I/O —— 即,您不能只从套接字读取并阻塞直到数据进入。有两种方法:您可以在其自己的线程中服务每个客户端(或其自己的进程,在 UNIX 系统上使用fork()),或者您可以使用select()select() 函数是一种检查数据是否在任何一组文件描述符上可用的方法。它在 UNIX 和 Windows 上都可用。

    【讨论】:

    • 你忘了一个选项,你也可以fork,这是传统的Unix处理方式。
    • 如果你使用单独的线程,你不需要避免阻塞 I/O。
    【解决方案2】:

    这是来自Beej's Guide to Network Programming 的一个简单示例。

    while(1) {  // main accept() loop
        sin_size = sizeof their_addr;
        new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
        if (new_fd == -1) {
            perror("accept");
            continue;
        }
    
        inet_ntop(their_addr.ss_family,
            get_in_addr((struct sockaddr *)&their_addr),
            s, sizeof s);
        printf("server: got connection from %s\n", s);
    
        if (!fork()) { // this is the child process
            close(sockfd); // child doesn't need the listener
            if (send(new_fd, "Hello, world!", 13, 0) == -1)
                perror("send");
            close(new_fd);
            exit(0);
        }
        close(new_fd);  // parent doesn't need this
    }
    

    子进程(在fork() 之后)从accept() 异步处理与父进程中的进一步连接的通信。

    【讨论】:

    • 链接不是答案。
    • avoid link only answers。答案“仅仅是指向外部网站的链接”may be deleted
    • 是的,人们自然会加入猎巫行动。
    • 我已在该网站最相关的部分添加; 是您如何使仅链接的答案不是诱饵。
    • 谢谢,多纳尔。这实际上是有道理的,而不是投反对票。
    【解决方案3】:

    是的,您的总体思路是正确的。

    虽然我的 C 套接字编程有点生疏,但在服务器套接字上调用 accept 会将通信通道设置回套接字的客户端。在未来的连接尝试中调用 accept 将设置多个套接字通道。

    这意味着应该注意不要用特定连接的数据覆盖单个共享结构,但这听起来不像是你容易犯的那种错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      相关资源
      最近更新 更多