客户端上的connect()如何与服务器端的accept()一起工作?
我正在编写一个简单的web服务器,下面是仅用于演示目的的代码(不健壮): 下面是客户端的代码:客户端上的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服务器不是并发
//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");
...