我试图追溯行为并编写了这个最小的代码来说明问题。
我尝试做的是无限地与客户端(浏览器)建立持久连接。这个想法是程序等待客户端请求一个页面,然后发回一个静态页面。
int main(){
// Set-up proxy and wait for 1 user
int sock;
proxy_listen(&sock, DEFAULT_PORT, 1);
printf("Proxy has started..\n");
puts("Waiting for user to connect..");
int sock_user = accept(sock, (struct sockaddr*)NULL, NULL);
printf("User connected.\n");
while (1){
// Receive client's request
char buff[1000];
int got = recv(sock_user, buff, sizeof(buff), 0); // IT WON'T BLOCK HERE
printf("Client sent bytes: %d\n", got);
char *resp="\HTTP/1.1 200 OK\r\n\
Content-Length: 68\r\n\
Connection: close\r\n\r\n\
<!DOCTYPE html><html><head></head><body><p>Got it!</p></body></html>\r\n";
// Send response
int sent = send(sock_user, resp, strlen(resp), 0);
printf("Proxy sent bytes: %d\n", sent);
}
return 0;
}
输出:
Proxy has started..
Waiting for user to connect..
User connected.
Client sent bytes: 1000
Proxy sent bytes: 145
Client sent bytes: 416
Proxy sent bytes: 145
Client sent bytes: 0
Proxy sent bytes: 145
Client sent bytes: 0
问题是循环不会在 recv 上暂停,而是继续下去,最终程序停止。这是为什么?
在响应中设置close to keep-alive似乎可以解决这个问题。我假设服务器端在第一次响应后关闭了连接。如果是这种情况,recv()不应该给我一个错误吗?如果套接字中的数据为零,为什么我希望它阻塞它会返回 0?