このコードはキープアライブを使用して同じIPアドレスを共有する多数のドメインをロードしますが、最初の25ドメインの後にバグがあり、ドメインロードごとに30秒遅れます!これを解決するには?バグキープアライブ遅延
#pragma comment(lib,"ws2_32.lib")
#include <WinSock2.h>
#include <iostream>
int main(){
WSAData wsaData;
WORD DllVersion = MAKEWORD(2, 1);
if (WSAStartup(DllVersion, &wsaData) != 0) {
MessageBoxA(NULL, "Winsock startup failed", "Error", MB_OK | MB_ICONERROR);
exit(1);
}
SOCKADDR_IN addr;
int sizeofaddr = sizeof(addr);
addr.sin_addr.s_addr = inet_addr("123.123.123.123");
addr.sin_port = htons(80);
addr.sin_family = AF_INET;
SOCKET Connection = socket(AF_INET, SOCK_STREAM, NULL);
if (connect(Connection, (SOCKADDR*)&addr, sizeofaddr) != 0)
{
MessageBoxA(NULL, "Failed to Connect", "Error", MB_OK | MB_ICONERROR);
return 0;
}
std::cout << "Connected!" << std::endl;
char MTD[] = "GET/HTTP/1.1\r\nHost:site.com\r\nConnection:keep-alive\r\n\r\nGET/HTTP/1.1\r\nHost:site.com\r\nConnection:keep-alive\r\n\r\nGET/HTTP/1.1\r\nHost:site.com\r\nConnection:keep-alive\r\n\r\nGET/HTTP/1.1\r\nHost:site.com\r\nConnection:keep-alive\r\n\r\nGET/HTTP/1.1\r\nHost:site.com\r\nConnection:keep-alive\r\n\r\nGET/HTTP/1.1\r\nHost:site.com\r\nConnection:keep-alive\r\n\r\nGET/HTTP/1.1\r\nHost:site.com\r\nConnection:keep-alive\r\n\r\nGET/HTTP/1.1\r\nHost:site.com\r\nConnection:keep-alive\r\n\r\nGET/HTTP/1.1\r\nHost:site.com\r\nConnection:keep-alive\r\n\r\nGET/HTTP/1.1\r\nHost:site.com\r\nConnection:close\r\n\r\n";
send(Connection, MTD, sizeof(MTD), NULL);
char MOTD[1];
int result;
while ((result = recv(Connection, MOTD, 1, NULL)) > 0){
std::cout << MOTD[0]; // ...
}
if (result == 0) {
// end of stream
std::cout << "end of stream";
close(Connection);
} else if (result < 0) {
// error
std::cout << "error";
perror("recv"); // at least
close(Connection);
} else {
std::cout << "data received";
// data received, in MOTD[0..result-1]
}
};
あなたのコードには大きなバグがあります:サイズが0の配列を持ち、 'recv'に1バイトを書き込んでオーバーフローさせ、*未定義の振る舞い*を持たせてください。 –
[同じIPのドメインを多数クロール]の可能な複製(http://stackoverflow.com/questions/43061474/crawl-lots-of-domains-from-the-same-ip) –
バグがありますあなたのループは、データを受信する、つまり、あなたは失敗を確認しません。 'recv'は接続が閉じているときは' 0'を返し、エラーがあるときは 'SOCKET_ERROR'(通常は' -1')を返します。 C++では、ゼロ以外の値はすべて「true」と見なされるため、回復不能な障害が発生しても、何も起こらないかのように処理を続けます。そして、一度に1バイトを読むループを持つことは実際には効果がありません。 –