检测服务器的远程端口开启和关闭状态

检测服务器的远程端口开启和关闭状态方式1:telnet在远程服务器上运行一个tcp服务端和客户端,使用了端口9898测试之前的配置: 配置端口禁用和开启有两种方式:方法1:打开windows防火墙 “控制面板”打开“windows防火墙”,选择“高级

方式1:telnet
在远程服务器上运行一个tcp服务端和客户端,使用了端口9898

测试之前的配置:	配置端口禁用和开启
有两种方式:
方法1:打开windows防火墙
	“控制面板”打开“windows防火墙”,选择“高级设置”,左侧点击“入站规则”后,右侧点击“新建规则”,(规则类型->端口;协议和端口->Tcp,特定本地端口(例如:9898);操作->允许连接;配置文件->(默认);名称->(填写端口号9898,方便记忆);完成)。
	在入站规则中找到配置好的“9898”双击;在属性中的“常规”配置“允许连接”或者“阻止连接”即可
	

方法2:通过IP安全策略禁用端口
网上找一下,类似(稍微麻烦点)
[如何开启和关闭Windows Server 2012端口](https://www.louishe.com/2019/10/17/doc-5834.html)
配置好后测试:
服务器1:10.126.10.80
服务器2:10.126.10.99	;	配置的上述的端口9898

在服务器1中打开cmd;
运行telnet 10.126.10.99 9898
结果显示连接失败???
因为你需要开一个程序使用9898端口
可以使用一个我提供的简单的tcp程序:
在10.126.10.99上运行后;再在10.126.10.80上执行telnet 10.126.10.99 9898,结果显示连接成功。
如何退出telnet如下!!!
telnet 远程ip port
失败的话会有反馈的
成功后,如何退出?
	快捷键:1:Ctrl + ]; 2:点击字母‘q’后,按下“Enter”即可退出

方法1通过telnet命令检测9898端口开放和关闭状态;
方法2通过程序实现端口状态检测!!!(类似 telnet 远程ip port 命令)

方式2:
通过tcp的select函数
原理:设置非阻塞connect,connect的返回值为-1,不能最为判断条件
通过select函数调用,通过检测远程服务器能否被写 判断端口是否开放和关闭。
Sock.cpp:

// Sock.cpp: implementation of the CSock class.
//
//

#include "stdafx.h"
#include "Sock.h"

//
// Construction/Destruction
//

CSock::CSock()
{ 
   
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2,2), &wsaData);
	m_sock=INVALID_SOCKET;
}

CSock::~CSock()
{ 
   
	  Close();
	  WSACleanup();
	 
}
bool CSock::CreateSock(const char *szIP,int nPort)
{ 
   
	m_sock=socket(AF_INET,SOCK_STREAM,0);
	if (m_sock == INVALID_SOCKET)
		return false;
	struct sockaddr_in inAddr;
	memset(&inAddr,0,sizeof(inAddr));
	inAddr.sin_family=AF_INET;
	inAddr.sin_port=htons(nPort);
	inAddr.sin_addr.S_un.S_addr=inet_addr(szIP);

	u_long b =  1;
	ioctlsocket(m_sock, FIONBIO, &b); //设置非阻塞
	//bool ret=false;

	if (connect(m_sock, (struct sockaddr*)&inAddr, sizeof(inAddr)) == -1)
	{ 
   
		int len = sizeof(int);
		timeval tm;
		fd_set fd;
		fd_set fdwrite;
		int error = -1;
		tm.tv_sec = 0;
		tm.tv_usec = 500000;
		FD_ZERO(&fdwrite);
		FD_SET(m_sock, &fdwrite);
		int ret;
		ret = select(m_sock + 1, NULL, &fdwrite, NULL, &tm);
		//if ((ret = select(m_sock + 1, NULL, &fd, NULL, &tm)) > 0)
		if (ret == -1)
			printf("select error!");
		else if (ret == 0)
			printf("select: ret = 0\n");
		else if (ret > 0)
		{ 
   
			int y = 0;
			int z = sizeof(y);
			if (getsockopt(m_sock, SOL_SOCKET, SO_ERROR, (char*)&y, &z) == SOCKET_ERROR)
			{ 
   
				Close();
				return false;
			}
			//TODO: 判断能否写数据
			if (FD_ISSET(m_sock, &fdwrite))
			{ 
   
				printf("open!\n");//端口打开
				return true;	//如果CreateSock返回true,端口正常
			}
		}

	}

	return  false;
}
int CSock::SendBuffer(char *pBuffer,int nLen)
{ 
   
	if(m_sock==INVALID_SOCKET) return false;
	int nResLen=send(m_sock,pBuffer,nLen,0);
	
	timeval tm;
	fd_set set;
	int error=-1;
	tm.tv_sec = 0;
	tm.tv_usec = 500000;
	FD_ZERO(&set);
	FD_SET(m_sock, &set);
	select(m_sock+1, NULL, &set, NULL, &tm);
	if(nResLen==nLen)
      return 1;
	else
	  return 0;
}
void CSock::Close()
{ 
   
    if(m_sock != INVALID_SOCKET)
	{ 
   
		  closesocket(m_sock);
		  m_sock=INVALID_SOCKET;
	}
}



Sock.h:

// Sock.h: interface for the CSock class.
//
//

#if !defined(AFX_SOCK_H__0FE4DAC7_EE90_4651_817E_6725D79BC6A9__INCLUDED_)
#define AFX_SOCK_H__0FE4DAC7_EE90_4651_817E_6725D79BC6A9__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <WINSOCK2.H>

class CSock  
{ 
   
public:
	CSock();
	virtual ~CSock();
	bool CreateSock(const char *szIP,int nPort);
	int SendBuffer(char *pBuffer,int nLen);
	void Close();
private:
	SOCKET m_sock;

};

#endif // !defined(AFX_SOCK_H__0FE4DAC7_EE90_4651_817E_6725D79BC6A9__INCLUDED_)

main中调用

//添加需要的头文件
int main()
{ 
   
	CSock listenPort;
	bool ret = listenPort.CreateSock(tmpip.GetBuffer(0), it);
	listenPort.Close();
	if(ret)
	{ 
   
		//端口打开
	]
	else
	{ 
   
		//端口关闭
	}
	return 0;
]

今天的文章检测服务器的远程端口开启和关闭状态分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/65865.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注