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

方式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;
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值