Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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++ C++;服务器HTTP请求数据包泄漏?2天后网络速度减慢_C++_Sockets_Http_Winapi_Server - Fatal编程技术网

C++ C++;服务器HTTP请求数据包泄漏?2天后网络速度减慢

C++ C++;服务器HTTP请求数据包泄漏?2天后网络速度减慢,c++,sockets,http,winapi,server,C++,Sockets,Http,Winapi,Server,我制作了一个服务器,它使用HTTP请求发布到我的网站并等待响应。程序中名为heartbeat()的函数将每隔3秒向我的网站持续发送一个HTTP请求 我无法获得HTTP请求库,所以我不得不在网上查找C++中的自定义代码来完成它。它可以工作,但我发现,如果我在两天后离开服务器,我的网络就会完全停止。是的,这肯定是我的服务器在做这件事,因为我一直在看我的网络,如果我有两天没有打开我的服务器,这是完全好的。是服务器 我真的不知道是什么原因导致了这种情况,所以我想知道是否有人可以看看我的心跳/http函数

我制作了一个服务器,它使用HTTP请求发布到我的网站并等待响应。程序中名为heartbeat()的函数将每隔3秒向我的网站持续发送一个HTTP请求

<>我无法获得HTTP请求库,所以我不得不在网上查找C++中的自定义代码来完成它。它可以工作,但我发现,如果我在两天后离开服务器,我的网络就会完全停止。是的,这肯定是我的服务器在做这件事,因为我一直在看我的网络,如果我有两天没有打开我的服务器,这是完全好的。是服务器

我真的不知道是什么原因导致了这种情况,所以我想知道是否有人可以看看我的心跳/http函数,看看它是否有任何缺陷,可能导致某种数据包泄漏,或者在该函数每3秒调用一次后的2天后,它是否会减慢我的网络速度。

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;

}