Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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
C-为什么我的服务器套接字在一个请求后停止接收send()传递的数据?_C_Sockets_Server_Request_Httpserver - Fatal编程技术网

C-为什么我的服务器套接字在一个请求后停止接收send()传递的数据?

C-为什么我的服务器套接字在一个请求后停止接收send()传递的数据?,c,sockets,server,request,httpserver,C,Sockets,Server,Request,Httpserver,我正在用c创建一个程序,它侦听GET和PUT请求并将它们路由到httpserver。问题是,在大约N个请求(N=服务器数量)之后,httpserver停止响应,因为它在第一个请求之后没有从客户端接收数据 我通过使用accept()接受客户端连接来转发数据,从客户端套接字读取数据,并使用recv将来自客户端的数据放入缓冲区,直到返回0。我使用send()将此缓冲区发送到服务器: 我想知道我是否没有正确地检测到客户端输入的结尾,但是我打印了send()的输出,返回的字节数正好是我期望的,但服务器没有

我正在用c创建一个程序,它侦听
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);