一个典型的TCP端口扫描器,通过用connect函数对服务器进行尝试连接来判断该服务器上的端口是否开放。这个扫描器是多线程的,现在的Winsock编程大多数采用多线程技术,这样可以充分利用带宽,如Netants的5个蚂蚁下载,一些FTP软件的多线程上传,等等!
//Source Code In C++Builder5
#pragma hdrstop
#include “Unit1.h”
#define threadNum 10//线程数
#define mutexName “Welcome to LoveBcb.yeah.net”
#pragma package(smart_init)
#pragma resource “*.dfm”
typedef struct g_scan //这是一个自定义的结构
{
char szFile[40];//用于存放结果的文件名
char szMutex[40];//用于存放互斥体的名字,这是多线程保证线程安全的一种方法
unsigned short sPort;//扫描的起始端口,本机字节顺序
unsigned short ePort;//扫描的终止端口,本机字节顺序
unsigned long goalI;//目标主机IP,网络字节顺序
int Result;//用于存放结果
}*PG_SCAN;
TForLover *ForLover;//这是窗体
HANDLE hThread[threadNum];
g_scan gscan[threadNum];
DWORD dwThreadId,dwThreadCode;
unsigned short usPart;//用于分割所要扫描的端口数,分配给各个线程
unsigned long ulIp;
int iLiveThread;//用于存放活动的线程数
unsigned long ServerIp(char*serverip);
DWORD WINAPI ScanPort(LPVOID lp)
/*这是主线程函数ScanPort*/
DWORD WINAPI ScanPort(LPVOID lp)
{
PG_SCAN pgscan=(PG_SCAN)lp;
char szResult[40];
sockaddr_in sock;
unsigned short nowPort=pgscan→sPort-1;//用于存放当前扫描的端口号
FILE*fp;//文件指针
HANDLE hMutex=OpenMutex(MUTEX_ALL_ACCESS,false,pgscan→szMutex);
SOCKET sk=socket(AF_INET,SOCK_STREAM,0);
sock.sin_family=AF_INET;
sock.sin_addr.s_addr=pgscan→goalIp;
while(nowPort
{
sock.sin_port=htons(++nowPort)
if(connect(sk,(sockaddr*)&sock,sizeof(sock))==SOCKET_ERROR)
continue;
/*由于这里用的是阻塞方式的套接字,所以返回SOCKET_ERROR一般意味着无法连接,于是用continue结束本次循环,即重新开始一次循环。如果返回值不是SOCKET_ERROR的话,表示连接成功,也就是说目标主机上开放了此端口*/
wsprintf(szResult,“目标主机:%s端口:%d开放\r\n”,inet_ntoa(sock.sin_addr),nowPort); WaitForSingleObject(hMutex,INFINITE);
/*用WaitForSinleObject保证线程安全INFINITE表示一直等待,直到互斥体有信号*/
fp=fopen(pgscan→szFile,“a”);
fwrite(szResult,sizeof(char),strlen(szResult),fp);
fclose(fp);
pgscan→Result++;
ReleaseMutex(hMutex);//释放互斥体
closesocket(sk);//由于已经建立了连接,所以这里要关闭连接
sk=socket(AF_INET,SOCK_STREAM,0);//重新创建一个套接字
}
分享到:
相关推荐
SOCKET三大通讯问题,关于开发SOCKET开发过程经常遇到的三个问题
利用Socket,实现三角形面积的计算,并支持一台服务器,多个客户端的能力
DELPHI 用SOCKET搭的三层架构 经测试通过
分别在SendSocket和ReceiveSocket函数里加上Sleep(0)即可修补由于文件过大导致的错误。Sleep(0):提交控制权 Simplex 单工通信 Full-Duplex 全双工通信 TransmitFile 双向文件传输 大文件传输过程发现接收端和发送...
1 匹配成功 2 有人发消息 3 匹配需要等待 4普通消息推送(有人离开) 5普通消息(取消匹配成功) //6 在线人数通知
使用Socket方式的3层结构源码,只有新增,修改,删除等功能。远程服务器duancy.gnway.net是一个登录在我公司电脑上的动态域名,所以,要测试连接的话,最好在上午9:30到下午18:30。我不是高手,只希望一起学习!
Socket三种通讯方式代码详解.包括upd,tcp,socket.
delphi三层源码socketconnect
实验三Socket通信实验报告 (1)实验目的和要求 1. 掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法; 2. 掌握客户/服务器(C/S)应用的工作方式; 3. 学习网络中进程之间通信的原理和实现方法; 4. 理解单...
服务器客户端实现求三角形面积,利用Socket编程实现
三种不同的方法进行端对端通信,主要有SOCKET, TCP,UDP通信原理
MFC socket编程 三个例子,利用MFC进行TCP通信,实现数据传输,能在vs2013,2015,2017使用
想学socket通信的,这是一个好东西啊
C#socket TCP是面向连接的通信,所以在通信之前,客户端与服务器端必须通过三次握手建立连接,然后在通信完毕,还要通过四次挥手断开连接
在前人MYQQ版本基础上,改进的一个仿QQ聊天程序,我叫他MYQQPLUS,已经实现文字和基本的视频...故QQ类库组件中有TCPSocketClient,TCPSocketServer,UDPSocket三种,目前只用到TCPSocketClient,TCPSocketServer两个组件了.
要想与服务器通信必须具备三个条件:服务器程序、客户程序和连接它们的socket程序。这三个部分缺一不可。但是,客户与服务器之间的通信有很多的方式,其中另一个方法是把客户作为索取者,把服务器作为给予者。下面...
android socket 工具开发,android socket sdk,简单的android socket 代码
MFC中的Socket类。这里先来考虑一个只有客户端向服务方发信息的单向通信,并且也只有客户端会主动提出断开连接的最简单的情形(相反过程的原理是一样的)。...这三个套接字对象对应三个Socket类,都继承自CAsyncSocket
刚刚学习socket的时候编写的程序,可以实现客户端连续向服务器发送三个数据,服务器端连续接受三个数据并返回给客户端处理结果
所以我对socket进行了封装,客户端和服务端可以通过配置注解,让双方相互调用注解方法,提供了专门的工具类,让注解方法可以支持返回list或map等集合或其他的类型,三行代码你就可以完美的使用socket进行通信,支持...