C-为什么我的服务器套接字在一个请求后停止接收send()传递的数据?
我正在用c创建一个程序,它侦听C-为什么我的服务器套接字在一个请求后停止接收send()传递的数据?,c,sockets,server,request,httpserver,C,Sockets,Server,Request,Httpserver,我正在用c创建一个程序,它侦听GET和PUT请求并将它们路由到httpserver。问题是,在大约N个请求(N=服务器数量)之后,httpserver停止响应,因为它在第一个请求之后没有从客户端接收数据 我通过使用accept()接受客户端连接来转发数据,从客户端套接字读取数据,并使用recv将来自客户端的数据放入缓冲区,直到返回0。我使用send()将此缓冲区发送到服务器: 我想知道我是否没有正确地检测到客户端输入的结尾,但是我打印了send()的输出,返回的字节数正好是我期望的,但服务器没有
GET
和PUT
请求并将它们路由到httpserver。问题是,在大约N个请求(N=服务器数量)之后,httpserver停止响应,因为它在第一个请求之后没有从客户端接收数据
我通过使用accept()
接受客户端连接来转发数据,从客户端套接字读取数据,并使用recv
将来自客户端的数据放入缓冲区,直到返回0。我使用send()
将此缓冲区发送到服务器:
我想知道我是否没有正确地检测到客户端输入的结尾,但是我打印了send()
的输出,返回的字节数正好是我期望的,但服务器没有收到它
每次我单独向服务器发出请求时,服务器都能正常工作。服务器以类似的方式接收连接(我无法更改服务器),它使用accept()
接受客户端连接,并使用recv从该套接字读取数据。为了澄清,我没有服务器代码,但我有自己的代码,它的工作原理与我在本项目中使用的代码类似,我也用它进行了测试(问题仍然存在):
关于
send()
或缓冲区,我是否有误解?我已尝试使用O_NONBLOCK标志,并使用select()
确定从哪个套接字读取,因此我不知道是否存在阻塞问题。服务器没有收到它。服务器做什么,而不是接收它?int client\u sockd=accept(server\u sockd,&client\u addr,&client\u addrlen);int bytes=recv(server_sockd,buff,buff_SIZE,0)代码>这是实际代码吗?recv
套接字应该使用client\u sockd
而不是server\u sockd
。你的意思是你的代码被阻止在recv
中吗?在读取0字节之前,你不能盲目地从客户端读取。这意味着客户端已断开连接,因此您将无法向其发送回复。而且您不能在单个recv()
调用中读取整个HTTP请求。您需要在循环中调用recv()
,并实际解析客户机的请求,以了解请求何时结束。看见如图所示的代码不是有效的HTTP接收器,更不用说对HTTP 1.1客户端不起作用了,这些客户端使用keep alives在多个请求之间保持连接打开server@kaylum,不,事实上那不是代码。我没有访问服务器代码的权限,只有我的中间代码,但我知道这与它的实现方式类似
int connect(int from, int to) {
char buf[BUFFSIZE];
int n = recv(from, buf, BUFFSIZE-1, 0);
if (n == 0) {
return 0;
}
buf[n] = '\0';
n = send(to, buf, n, 0);
if (n == 0) {
return 0;
}
return n;
}
int acceptfd = accept(listenfd, &client_addr, &client_addrlen)
connect(acceptfd, serverfd)
char buff[BUFF_SIZE + 1];
int client_sockd = accept(server_sockd, &client_addr, &client_addrlen);
int bytes = recv(server_sockd, buff, BUFF_SIZE, 0);