我有一个监听器,它将任意数据,HTTP请求传递给网络套接字,然后通过TCP传递.这适用于第一个请求,但侦听器不接受后续的新请求.
我的问题是:
如果我有,sock=accept(listener,(struct addr *)&sin, &sinlen);
那么基于套接字函数引用,侦听器套接字保持打开状态,我应该能够accept()
为后续请求重新调用任意次.它是否正确?如果是这样,有人比我更熟悉套接字编程,请解释这段代码的外观吗?
是的,您可以accept()
多次使用侦听套接字.要为多个客户端提供服务,您需要避免阻塞I/O - 即,在数据进入之前,您不能只读取套接字和阻塞.有两种方法:您可以在自己的线程中为每个客户端提供服务(或者自己的进程,fork()
在UNIX系统上使用),或者你可以使用select()
.该select()
函数是一种检查数据是否可用于任何一组文件描述符的方法.它可以在UNIX和Windows上使用.
以下是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()
父进程中的其他连接异步处理通信.