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

Tok*_*Tok 5 c sockets

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

我的问题是:

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

Ern*_*ill 9

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

  • 你忘了一个选项,你也可以fork这是传统的Unix处理方式. (6认同)

Nik*_*sov 6

以下是Beej的网络编程指南中的一个简单示例.

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
}
Run Code Online (Sandbox Code Playgroud)

子进程 - 在 - 之后fork()- 从accept()父进程中的其他连接异步处理通信.

  • 我在该网站的最相关部分添加了; _that_是你如何使一个纯链接的答案不是接近诱饵. (2认同)