1. 程式人生 > >tcp 80和443埠探測程式碼

tcp 80和443埠探測程式碼

      以前寫過, 最近要用, 來整合一下, 方便後續用:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>
#include <stdarg.h>
#include <fcntl.h>
#include <time.h>

#include <iostream>
#include <fstream>
using namespace std;


int telnetCheckTcp(const char *ip, int port, int tSecond)
{
	int sockClient = socket(AF_INET, SOCK_STREAM, 0);
	int iFinal = 0;

	struct sockaddr_in addrSrv;
	addrSrv.sin_addr.s_addr = inet_addr(ip);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(port);

	fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0)|O_NONBLOCK);  
	
	int iRet = connect(sockClient, ( const struct sockaddr *)&addrSrv, sizeof(struct sockaddr_in));  // 返回-1不一定是異常
	if (iRet != 0)	
	{  
		if(errno != EINPROGRESS)
		{
			iFinal = -1;	
		}
		else  
		{
			struct timeval tm = {tSecond, 0}; 
			fd_set wset, rset;	
			FD_ZERO(&wset); 
			FD_ZERO(&rset); 
			FD_SET(sockClient, &wset);	
			FD_SET(sockClient, &rset); 
			int time1 = time(NULL);
			int n = select(sockClient + 1, &rset, &wset, NULL, &tm);  
			int time2 = time(NULL);

			if(n < 0)	
			{  
			    iFinal = -2;	  
			}  
			else if(n == 0)  
			{  
			    iFinal = -3;	  
			}  
			else if (n == 1)  
			{
			   if(FD_ISSET(sockClient, &wset))	
			   {  
				   iFinal = 0;	 
				   fcntl(sockClient, F_SETFL, fcntl(sockClient, F_GETFL, 0) & ~O_NONBLOCK);  
			   }  
			   else  
			   {  
				   iFinal = -4;	
			   }  
			}
			else
			{
				iFinal = -5;	
			}
		}  
	}  

	close(sockClient);
	return iFinal;
}


int main(int argc, char *argv[])  // ./a.out ipfilename port1 port2 timeout dstfilename
{
	if(argc != 6)
	{
		cout << "error" << endl;
		return -1;
	}

	ifstream in(argv[1]);
	string filename;
	string line;

	unsigned int i = 0;
	if(in) // 有該檔案
	{
		while (getline (in, line)) // line中不包括每行的換行符
		{
			// 這裡最好做ip格式判斷
			i++;
			int iFinal = telnetCheckTcp(line.c_str(), atoi(argv[2]), atoi(argv[4]));
			if(iFinal == 0)
			{
				//printf("iFinal is %d, ip is %s,  index is %d\n", iFinal, line.c_str(), i);
			}
			else
			{
				iFinal = telnetCheckTcp(line.c_str(), atoi(argv[3]), atoi(argv[4]));
				if(iFinal == 0)
				{
					//printf("iFinal is %d, ip is %s,  index is %d\n", iFinal, line.c_str(), i);
				}
				else
				{
					//printf("iFinal is %d, cannot connect to %s, index is %d\n", iFinal, line.c_str(), i);

					char szCmd[128] = {0};
					snprintf(szCmd, sizeof(szCmd), "echo %s >> %s", line.c_str(), argv[5]);
					system(szCmd);
				}
			}
		}
	}
	else // 沒有該檔案
	{
		cout <<"no such file" << endl;
	}

	return 0;
}

      試了一下, 靠譜。 不多說。

相關推薦

tcp 80443探測程式碼

      以前寫過, 最近要用, 來整合一下, 方便後續用: #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h

Ubuntu16.04下將Django框架部署到伺服器80443

1.安裝Django框架pip install Django2.埠部署apache2網站部署檔案位於/etc/apache2/sites-available, 預設檔案為000-default.conf, 加了CA證書後的配置檔案為:000-default-le-ssl.co

netty同時繫結80443

public static void main(String[] args) throws Exception { ContextProvider.onStart(); File keyFile = new File("/out/my.pk8"); //使用p

ubuntu tomcat啟用80443

ubuntu預設不允許使用者使用1023及以下埠,需要如下操作(需已安裝authbind): 1. 修改/etc/default/tomcat7,改#AUTHBIND=no為AUTHBIND=yes 2. 執行一下指令: sudo touch /etc/authbind/b

阿里雲centos7伺服器關於80443

昨天登入阿里雲平臺被告知我的伺服器被別人在美國等地使用git登入過,我懷疑是我的密碼洩露了,所以修改密碼後重啟伺服器,隨後寫的小程式發現不能用了(小程式要求https方式訪問),排查了老半天,發現443埠不通,隨後自己折騰了一下午,解決了,自己記錄一下。 開啟埠的步驟: 檢

nginx 80443同時做負載均衡

ups art 均衡 負載均衡 follow service cert 同時 remote nginx 80和443同時做負載均衡: vi /etc/nginx/conf.d/default.conf upstream bugqa.ming.com {server 10.0

iptables 如何只開放80 22

# Generated by iptables-save v1.4.7 on Tue Aug 18 11:44:46 2015 *filter :INPUT ACCEPT [17053:17940802] :FORWARD ACCEPT [0:0] :OUTPUT ACCE

macOS - TS1629 Apple 使用的 TCP UDP

TS1629 地址:http://support.apple.com/kb/TS1629 後被重定向到: https://support.apple.com/zh-cn/HT202944 2018年8月30日 轉自上述連線 Apple 軟體產品所使用的 TCP 和 UDP

檢查 TCP 80 是否正常工作

如果你的例項無法對外提供 HTTP 服務,你可以按以下步驟檢查 Web 服務相關的介面(預設為 TCP 80)是否正常工作: 1、在 ECS 管理控制檯,確認安全組已經放行該埠。 2、遠端連線 ECS 例項,確認服務已經開啟。 3、確認埠正常被監聽。如沒有,請修改監聽地址。 4、確認

phpstudy執行時803306被佔用解決方法

80埠負責Apache執行 3306埠負責MySQL執行 當這兩個埠被佔用時,則不能執行程式 首先檢視什麼程式佔用埠,按住window+R,輸入cmd,點確定 進入cmd的介面,在輸入“netstat -ano” 再按回車鍵 找到埠以及對應的PID值 然後

使用虛擬串列軟體串列除錯助手來測試串列通訊程式碼

轉載自:http://blog.csdn.net/u013232740/article/details/49838233 為解決計算機的物理串列埠個數的限制,在進行串列埠除錯實驗時,應儘可能採用虛擬串列埠軟體。VSPD(Virtual Serial Ports Driv

nginx配置ssl協議https +tomcat 非80/443反向代理的配置方式

--開始 Nginx增加以下配置 proxy_set_header Host $host:$server_port; 非80埠 ,用80埠時 不需要$server_port proxy_set_header X-Real-IP $remote_addr; proxy_se

Centos 7防火牆iptables開放指定(80)設定ftp的方法

開啟80埠 複製程式碼 1firewall-cmd --zone=public --add-port=80/tcp --permanent出現success表明新增成功命令含義:--zone #作用域--add-port=80/tcp  #新增埠,格式為:埠/通訊協議-

C#.net同步非同步SOCKET通訊多執行緒總結(5)tcp傳送接受的程式碼

基於TCP協議的傳送和接收端 TCP協議的接收端 using System.Net.Sockets ; //使用到TcpListen類 using System.Threading ; //使用到執行緒 using System.IO ; //使用到StreamReader類 int port = 800

伺服器808080更改

伺服器一般預設為8080,但有的時候卻需要使用80埠比如微信小程式開發,指定只能有80埠找到tomcat裡面的server.xml檔案右擊編輯找到箭頭所指項,直接更改為80    然後儲存即可執行tomcat  此時埠號已經被更改相同的80更改為8080埠也是同樣的步驟

對於jetty eclipse 老是呼叫不到最新的程式碼 修改 配置

 對於jetty eclipse 老是呼叫不到最新的程式碼  ,必須要把解析工作空間的前面的勾打上。 配置jeety:run的時候記得要將下面的打上勾,否則呼叫不到最新的程式碼。(jetty:run -Djetty.port=9090 )  修改埠 Resolve Wo

【基本網路概念之三】IP、TCPUDP IP地址域名

IP、TCP和UDP   java支援的協議只有TCP和UDP,以及建立在TCP和UDP之上的應用層協議。所有其他傳輸層、網際層和更底層的協議,如ICMP、IGMP、ARP和其他協議在java程式中都只能通過連結到原生程式碼來實現。 IP地址和域名   I

nginx 監聽多個 8081

首先找到nginx的配置檔案nginx.conf,開啟配置檔案後找到類似下面一段: [[email protected] nginx]# cd /etc/nginx/conf.d/然後把目錄下面的檔案都列出來:[[email protected] con

tomcat設定https時,8443443的區別

1. 8443埠在訪問時需要加埠號,相當於http的8080,不可通過域名直接訪問,需要加上埠號;https://xiangye.com:8443。 2. 443埠在訪問時不需要加埠號,相當於htt

skype默認占用80443port

sta netstat 使用 class 發現 -a pid 禁止 穿透 今天把server的port更改為80,結果起不來,報告“port已經被占用”的錯誤。 使用下列命令找到了元兇: 1. netstat -ano | findstr 80 找到占用80po