Я написал HTTP-клиент с c ++ для загрузки файлов в фоновом режиме, и он работает усердно, но он искажается, когда я загружаю pdf, который обычно не поврежден.
Существуют такие библиотеки, как libcurl poco для этого. Но так как я хотел увидеть основы, я написал чистый код сокета. Я посмотрел на исходный код библиотек (например, curl), но ничего из них не понял.
file.pdf адрес: https://www.axmag.com/download/pdfurl-guide.pdf
Это мой код:
#include <iostream>
#include <stdio.h>
#include <WS2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
void main()
{
setlocale(LC_ALL,
"Turkish");
WSADATA wsdata;
WORD ver = MAKEWORD(2, 2);
int ws0k = WSAStartup(ver, &wsdata);
if (ws0k != 0) {
return;
}// classic startup operations
SOCKET client = socket(AF_INET, SOCK_STREAM, 0);
if (client == INVALID_SOCKET) {
return;
}
else {
cout << "Soket oluşturuldu." << endl; // successfully created socket
}
struct hostent* host;
host = gethostbyname("www.axmag.com");
sockaddr_in target;
target.sin_addr.S_un.S_addr = *((unsigned long*)host->h_addr); //WEBSITE ADDRESS
target.sin_port = htons(80); // HTTP PORT : 80
target.sin_family = AF_INET; // I don't know the address family of http.
int conn = connect(client, (sockaddr*)&target, sizeof(target));
if (conn < 0) {
return;
}
else {
cout << "Bağlantı isteği başarılı." << endl; // successfully connected.
}
char HTTP_MESSAGE[] = "GET /download/pdfurl-guide.pdf HTTP/1.0\r\nHost: www.axmag.com\r\nConnection: close\r\n\r\n";
if (send(client, HTTP_MESSAGE, sizeof(HTTP_MESSAGE), 0) < 0) { // send http request.
return;
}
else {
cout << "Komut başarıyla gönderildi." << endl; // Successfully send http request.
}
FILE* file = NULL; // file
file = fopen("C:\\Users\\user\\Desktop\\test.pdf", "wb"); //Create file
if (file == NULL) {
return;
}
else {
cout << "Dosya oluşturuldu." << endl; //Successfully created file.
}
char recvbuf[1024];
int received;
while (received = recv(client, recvbuf, sizeof(recvbuf), 0) > 0) { // RECV
cout << recvbuf << endl;
fwrite(recvbuf, 1, received, file); // write data to file
}
fclose(file);
closesocket(client);
WSACleanup();
system("pause");
}
Я успешно загружаю его. Проблема была с функцией fwrite. Я изменил параметр ElementSize на значение буфера, и это произошло.
Код решения:
char recvbuf[64];
int received;
while (received = recv(client, recvbuf, sizeof(recvbuf), 0) > 0) { // RECV
cout << recvbuf << endl;
fwrite(recvbuf, 64, received, file); // write data to file
}