gpt4 book ai didi

c++ - 通过套接字正确发送 HTTP 响应

转载 作者:行者123 更新时间:2023-11-30 03:44:21 24 4
gpt4 key购买 nike

我有一个套接字应用程序,并希望允许浏览器发送/接收数据。不幸的是,由于某些奇怪的原因,这段代码不适用于 Chrome,也不适用于 curl。但奇怪的是,它似乎几乎可以与 Internet Explorer Edge 完美配合,甚至可以在 Internet 上使用一些 REST Playground 。

这可能是什么原因造成的?我想假设它与 header 有关,但是,我发送的 header 与另一个域完全匹配,但它仍然停滞不前。

Chrome 似乎加载了数据,但停滞了,并且从未收到官方响应——或者可能只是从未完成?我可以看到页面上的所有文本,但是,谷歌仍在加载,并且“服务器响应”报告说它什么也没收到。除此之外,我认为它向客户端发送了两次相同的响应。

这是我的代码:

// sockserver.cpp : Defines the entry point for the console application.
//

#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <process.h>
#include <stdio.h>
#include <map>
#pragma comment(lib,"ws2_32.lib" )

unsigned int __stdcall ServClient(void *data);

int main(int argc, char* argv[])
{

WSADATA wsaData;
int iResult;
sockaddr_in addr;
SOCKET sock, client;

addr.sin_family = AF_INET;
addr.sin_port = htons(5900);
addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.22");

iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);//2.2

if (iResult)
{
printf("WSA startup failed");
return 0;
}


sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (sock == INVALID_SOCKET)
{
printf("Invalid socket");
return 0;
}

iResult = bind(sock, (sockaddr*)&addr, sizeof(sockaddr_in));

if (iResult)
{

printf("bind failed %u", GetLastError());

return 0;
}

iResult = listen(sock, SOMAXCONN);

if (iResult)
{

printf("iResult failed %u", GetLastError());

return 0;
}

while (client = accept(sock, 0, 0))
{
if (client == INVALID_SOCKET)
{
printf("invalid client socket", GetLastError());
continue;
}
_beginthreadex(0, 0, ServClient, (void*)&client, 0, 0);

}


return 0;
}

std::map<int, SOCKET> sockList;
unsigned int __stdcall ServClient(void *data)
{
SOCKET* client = (SOCKET*)data;
SOCKET Client = *client;
printf("Client connected\n");

int xx = 0;

char chunk[200];
while (recv(Client, chunk, 200, 0))
{

char buf[] = "HTTP/1.1 200 OK\nContent-Type: text/html\nAccept: */*;Date:Sun, 21 Feb 2016 18:26:33 GMT\nServer: ubersnip\nContent-Length:18076\nAccept-Encoding:gzip, deflate, sdch\nAccept-Language:en-US,en;q=0.8\nCache-Control:max-age=0\nConnection:keep-alive\nHost:localhost:2222\nSet-Cookie:acct=t=t%2flE8KL9jDBOed05o1eMDiINlDfMvLxp&s=CUBOpXFMXmBt4u3pf%2fx5efr5WWkyGT3U; domain=.stackoverflow.com; expires=Sun, 21-Aug-2016 18:26:33 GMT; path=/; HttpOnly\n\n<html><body>Hello World</body></html>";

//sockList[sockList.size()] = Client;
send(Client, buf, strlen(buf), 0);
/*if (xx >= 1) {
closesocket(Client);
return 1;
}
else {
xx++;
}*/
printf("%s \t %d\n", chunk, GetCurrentThreadId());
}
return 0;
}

最佳答案

您将内容长度设置为 18076,但您的内容要小得多。因此浏览器将等待更多内容。但是,您并没有提供更多内容,而是等待浏览器发送另一个请求,因此客户端和服务器都在等待对方。

除了您发送的大量 header 之外没有任何意义:Accept、Accept-Encoding、Accept-Language 和 Host 都是与请求相关的 header ,在响应中没有任何意义。以 HTTP 结尾的正确行是 \r\n 而不是 \n 尽管浏览器通常不关心这个细节。

关于c++ - 通过套接字正确发送 HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35541537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com