Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
客户端上的connect()如何与服务器端的accept()一起工作?_C_Tcp_Network Programming - Fatal编程技术网

客户端上的connect()如何与服务器端的accept()一起工作?

客户端上的connect()如何与服务器端的accept()一起工作?,c,tcp,network-programming,C,Tcp,Network Programming,我正在编写一个简单的web服务器,下面是仅用于演示目的的代码(不健壮): 下面是客户端的代码: //client ... clientfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) connect(clientfd, p->ai_addr, p->ai_addrlen) printf("Successfully connected"); ... 这个简单的web服务器不是并发

我正在编写一个简单的web服务器,下面是仅用于演示目的的代码(不健壮):

下面是客户端的代码:

//client
...
clientfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol))
connect(clientfd, p->ai_addr, p->ai_addrlen)
printf("Successfully connected");
...
这个简单的web服务器不是并发服务器,因为它一次只能为一个客户机提供服务。因此,一个缓慢的客户端可以拒绝为其他所有客户端提供服务

但是当我打开两个终端作为客户端来连接服务器,并从第一个终端开始连接服务器,并且不做任何事情来阻止服务器时,我发现在第二个请求中,我也得到了“成功连接”,这让我很困惑


我的理解是,由于第一个请求在
accept()
之后被阻塞,因此第二个请求应该在
accept()
中被触发,因此第二个reuqest的
connect()
在第一个请求完成之前不应该返回。那么,为什么第二个请求的
connect()
仍然返回,即使服务器一次只能处理一个请求?

循环的其余部分做什么?为什么在循环之外提到
handlerequest
?您忽略了积压工作队列的存在。这是服务器上的一个队列,其中包含尚未由
accept()
返回的已完成连接。如果确实只希望只接受一个客户端,请在第一个
accept()
之后关闭侦听套接字。由于积压工作,第二次连接仍然会成功,但使用时会遇到连接重置。
//client
...
clientfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol))
connect(clientfd, p->ai_addr, p->ai_addrlen)
printf("Successfully connected");
...