C++ C++;服务器HTTP请求数据包泄漏?2天后网络速度减慢
我制作了一个服务器,它使用HTTP请求发布到我的网站并等待响应。程序中名为heartbeat()的函数将每隔3秒向我的网站持续发送一个HTTP请求 <>我无法获得HTTP请求库,所以我不得不在网上查找C++中的自定义代码来完成它。它可以工作,但我发现,如果我在两天后离开服务器,我的网络就会完全停止。是的,这肯定是我的服务器在做这件事,因为我一直在看我的网络,如果我有两天没有打开我的服务器,这是完全好的。是服务器 我真的不知道是什么原因导致了这种情况,所以我想知道是否有人可以看看我的心跳/http函数,看看它是否有任何缺陷,可能导致某种数据包泄漏,或者在该函数每3秒调用一次后的2天后,它是否会减慢我的网络速度。C++ C++;服务器HTTP请求数据包泄漏?2天后网络速度减慢,c++,sockets,http,winapi,server,C++,Sockets,Http,Winapi,Server,我制作了一个服务器,它使用HTTP请求发布到我的网站并等待响应。程序中名为heartbeat()的函数将每隔3秒向我的网站持续发送一个HTTP请求 我无法获得HTTP请求库,所以我不得不在网上查找C++中的自定义代码来完成它。它可以工作,但我发现,如果我在两天后离开服务器,我的网络就会完全停止。是的,这肯定是我的服务器在做这件事,因为我一直在看我的网络,如果我有两天没有打开我的服务器,这是完全好的。是服务器 我真的不知道是什么原因导致了这种情况,所以我想知道是否有人可以看看我的心跳/http函数
void循环(){
...
而(1){
如果(heartClock.getElapsedTime().asSeconds()>=3){
heartClock.restart();
线程heartThread(std::bind(&MasterServerHandler::heartbeat_服务器,cst::masterIP,tcp_端口,udp_端口,match->num_players(),false));
heartThread.launch();
}
}
}
/*
heartbeat_server:将heartbeat发布到主服务器列表,让它知道此服务器仍处于联机状态。
masterServerIP:要向其发布HTTP请求的网站的IP
tcp_端口:将服务器的tcp端口发布到主服务器列表
udp_端口:将服务器的udp端口发布到主服务器列表
curPlayers:发布当前连接到服务器的玩家数量
viewResponse:是否要查看回复
*/
void MasterServerHandler::heartbeat_服务器(std::string masterServerIP、int-tcp_端口、int-udp_端口、int-curPlayers、bool-viewsresponse){
if(cst::postServer==false)返回;
std::您是否尝试过使用wireshark之类的工具来分析您的网络上创建的流量?您的网络会减慢到停止状态,这意味着网络上的所有东西都运行缓慢,或者仅此服务器?您的post_data()
函数每次都会创建一个新的套接字,但不会再删除它。你正在泄漏套接字。你每3秒钟启动一个新线程,不管最后一个线程是否完成。关闭你的套接字,看看是否有用,如果没有,就回来。你是否尝试过使用wireshark之类的工具来分析在你的计算机上创建的流量你的网络?你的网络慢到停止,这意味着网络上的一切都运行缓慢,或者只有这台服务器?你的post_data()
函数每次都会创建一个新的套接字,但不会再删除它。您正在泄漏套接字。并且您每3秒启动一个新线程,不管最后一个线程是否已完成。关闭套接字,查看是否有帮助,如果没有帮助,请返回。
void loop(){
...
while(1){
if(heartClock.getElapsedTime().asSeconds() >= 3){
heartClock.restart();
sf::Thread heartThread(std::bind(&MasterServerHandler::heartbeat_server, cst::masterIP, tcp_port, udp_port, match->num_players(), false));
heartThread.launch();
}
}
}
/*
heartbeat_server: Posts a heartbeat to the master server list to let it know this server is still online.
masterServerIP: IP of the website to post HTTP request to
tcp_port: Posting the TCP port of the server to the master server list
udp_port: Posting the UDP port of the server to the master server list
curPlayers: Posting how many players are currently connected to the server
viewResponse: Whether or not we want to view the response back
*/
void MasterServerHandler::heartbeat_server(std::string masterServerIP, int tcp_port, int udp_port, int curPlayers, bool viewResponse){
if(cst::postServer == false) return;
std::cout << "heartbeat!" << std::endl;
std::mutex mut;
mut.lock();
std::string file = "heartbeat.php";
std::string tcp_port_s = "";
std::string udp_port_s = "";
std::string curPlayers_s = "";
stringstream sPort;
sPort << tcp_port; tcp_port_s = sPort.str(); sPort.str(std::string());
sPort << udp_port; udp_port_s = sPort.str(); sPort.str(std::string());
sPort << curPlayers; curPlayers_s = sPort.str(); sPort.str(std::string());
std::string data = "?tcp_port=" + tcp_port_s + "&udp_port=" + udp_port_s + "&curPlayers=" + curPlayers_s;
std::string response = post_data(file, data);
if(viewResponse){
cout << "WEB RESPONSE: " << endl;
cout << response << endl;
}
mut.unlock();
}
/*
post_data: Posts data via an HTTP request
file: The file to post data to
data: The data to post
*/
std::string MasterServerHandler::post_data(std::string file, std::string data){
string request;
string response;
int resp_leng;
char buffer[BUFFERSIZE];
struct sockaddr_in serveraddr;
int sock;
WSADATA wsaData;
const char* ipaddress = cst::masterIP.c_str();
std::string host = cst::masterHost;
int port = 80;
request+="GET /masterserverlist/" + string(file) + data + " HTTP/1.0\r\n";
request+="Host: " + host + "\r\n";
request+="\r\n";
//open socket
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
cout << "WEB socket() failed" << endl;
//connect
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(ipaddress);
serveraddr.sin_port = htons((unsigned short) port);
if (connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
cout << "WEB connect() failed" << endl;
//send request
if (send(sock, request.c_str(), request.length(), 0) != request.length())
cout << "WEB send() sent a different number of bytes than expected" << endl;;
//get response
response = "";
resp_leng= BUFFERSIZE;
while (resp_leng == BUFFERSIZE)
{
resp_leng= recv(sock, (char*)&buffer, BUFFERSIZE, 0);
if (resp_leng>0)
response+= string(buffer).substr(0,resp_leng);
//note: download lag is not handled in this code
}
return response;
}