C++檢測網絡端口是否被佔用

C++檢測網絡端口是否被佔用

最近在使用Nginx搭建Web服務器,Nginx(發音同 engine x)是一款輕量級的 Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個 BSD-like 協議下發行,可以在 UNIX、GNU/Linux、BSD、Mac OS X、Solaris,以及 Microsoft Windows 等操作系統中運行。將nginx設置成服務並開機自啓動,在配置文件中需要寫入端口號,但是系統中的端口號存在被佔用的情況,需要對端口號進行檢測,大體思路就是檢測8080端口是否被佔用,如果被佔用了端口號+1,如果仍被佔用再+1。

方法一:通過GetTcpTable/GetUdpTable方法判斷端口是否被佔用

#include <tcpmib.h>
#include <IPHlpApi.h>
//依賴lib庫 Iphlpapi.lib Ws2_32.lib
 
//獲取Tcp端口狀態
BOOL GetTcpPortState(ULONG nPort, ULONG *nStateID)
{
	MIB_TCPTABLE TcpTable[100];
	DWORD nSize = sizeof(TcpTable);
	if(NO_ERROR == GetTcpTable(&TcpTable[0],&nSize,TRUE))
	{
		DWORD nCount = TcpTable[0].dwNumEntries;
		if (nCount > 0)
		{
			for(DWORD i=0;i<nCount;i++)
			{
				MIB_TCPROW TcpRow = TcpTable[0].table[i];
				DWORD temp1 = TcpRow.dwLocalPort;
				int temp2 = temp1 / 256 + (temp1 % 256) * 256;
				if(temp2 == nPort)
				{
					*nStateID = TcpRow.dwState;
					return TRUE;
				}
			}
		}
		return FALSE;
	}
	return FALSE;
}
 
//獲取Udp端口狀態
BOOL GetUdpPortState(ULONG nPort, ULONG *nStateID)
{
	MIB_UDPTABLE UdpTable[100];
	DWORD nSize = sizeof(UdpTable);
	if(NO_ERROR == GetUdpTable(&UdpTable[0],&nSize,TRUE))
	{
		DWORD nCount = UdpTable[0].dwNumEntries;
		if (nCount > 0)
		{
			for(DWORD i=0;i<nCount;i++)
			{
				MIB_UDPROW TcpRow = UdpTable[0].table[i];
				DWORD temp1 = TcpRow.dwLocalPort;
				int temp2 = temp1 / 256 + (temp1 % 256) * 256;
				if(temp2 == nPort)
				{
					return TRUE;
				}
			}
		}
		return FALSE;
	}
	return FALSE;
}

方法二:通過socket綁定的方法判斷端口是否被佔用

BOOL GetSocketPortState(ULONG nPort)
{
	unsigned short usPort = (unsigned short)nPort;
	SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
	sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(usPort);
	addr.sin_addr.s_addr = htonl(INADDR_ANY);
	bind(s, (LPSOCKADDR)&addr, sizeof(addr));
	if (WSAGetLastError() == WSAEADDRINUSE)
	{
		//端口已被佔用
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章