接受多个后续连接到套接字

时间:2011-03-22 14:28:29

标签: c sockets

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

我的问题是:

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

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:6)

以下是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()父进程中的其他连接异步处理通信。

答案 2 :(得分:0)

是的,你有正确的总体想法。

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

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