У меня есть функция HTTP post_data в C ++, используемая для отправки HTTP-запроса на мой веб-сервер.
Примерно 1 из каждых 50 попыток, запрос фактически проходит, в остальное время он не отправляется.
Я понятия не имею, почему, но это должно пройти 100% времени. Вот моя функция post_data:
Одна из причин, по которой я не использую библиотеку HTTP, заключается в том, что я просто не мог заставить их работать несколько месяцев назад.
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 /folder/" + 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;;
//If we care about the response
//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
}
//disconnect
closesocket(sock);
return response;
}
Так кто-нибудь знает, почему иногда этот HTTP-вызов не проходит весь путь?
Я забрал closesocket (), и он работает, но если я уберу это, произойдут утечки пакетов, и это плохо, потому что эта функция вызывается очень часто.
Я также попытался заменить оператор while следующим:
while (resp_leng > 0)
И это просто петли навсегда. Это может быть потому, что соединение не было закрыто на стороне PHP, но у меня нет петель
вообще работает на моем сценарии PHP, так что не может быть.
Действительно запутался, почему это не работает.
Задача ещё не решена.
Других решений пока нет …