socket(3)

来源:互联网 发布:郑州淘宝学校 编辑:程序博客网 时间:2024/06/13 06:19

一个典型的TCP端口扫描器,通过用connect函数对服务器进行尝试连接来判断该服务器上的端口是否开放。这个扫描器是多线程的,现在的Winsock编程大多数采用多线程技术,这样可以充分利用带宽,如Netants5个蚂蚁下载,一些FTP软件的多线程上传,等等!

//Source Code In C++Builder5

Cpp代码 复制代码
  1. #pragma hdrstop   
  2. #include “Unit1.h”   
  3. #define threadNum 10//线程数   
  4. #define mutexName “Welcome to LoveBcb.yeah.net”   
  5. #pragma package(smart_init)   
  6. #pragma resource “*.dfm”   
  7. typedef struct g_scan //这是一个自定义的结构   
  8. {   
  9. char szFile[40];//用于存放结果的文件名   
  10. char szMutex[40];//用于存放互斥体的名字,这是多线程保证线程安全的一种方法   
  11. unsigned short sPort;//扫描的起始端口,本机字节顺序   
  12. unsigned short ePort;//扫描的终止端口,本机字节顺序   
  13. unsigned long goalI;//目标主机IP,网络字节顺序   
  14. int Result;//用于存放结果   
  15. }*PG_SCAN;   
  16.   
  17. TForLover *ForLover;//这是窗体   
  18. HANDLE hThread[threadNum];   
  19. g_scan gscan[threadNum];   
  20. DWORD dwThreadId,dwThreadCode;   
  21. unsigned short usPart;//用于分割所要扫描的端口数,分配给各个线程   
  22. unsigned long ulIp;   
  23. int iLiveThread;//用于存放活动的线程数   
  24. unsigned long ServerIp(char*serverip);   
  25. DWORD WINAPI ScanPort(LPVOID lp)   
  26. /*这是主线程函数ScanPort*/  
  27. DWORD WINAPI ScanPort(LPVOID lp)   
  28. {   
  29. PG_SCAN pgscan=(PG_SCAN)lp;   
  30. char szResult[40];   
  31. sockaddr_in sock;   
  32. unsigned short nowPort=pgscan→sPort-1;//用于存放当前扫描的端口号   
  33. FILE*fp;//文件指针   
  34.   
  35. HANDLE hMutex=OpenMutex(MUTEX_ALL_ACCESS,false,pgscan→szMutex);   
  36. SOCKET sk=socket(AF_INET,SOCK_STREAM,0);   
  37. sock.sin_family=AF_INET;   
  38. sock.sin_addr.s_addr=pgscan→goalIp;   
  39. while(nowPort    
  40. {   
  41. sock.sin_port=htons(++nowPort)   
  42. if(connect(sk,(sockaddr*)&sock,sizeof(sock))==SOCKET_ERROR)   
  43. continue;   
  44. /*由于这里用的是阻塞方式的套接字,所以返回SOCKET_ERROR一般意味着无法连接,于是用continue结束本次循环,即重新开始一次循环。如果返回值不是SOCKET_ERROR的话,表示连接成功,也就是说目标主机上开放了此端口*/  
  45. wsprintf(szResult,“目标主机:%s端口:%d开放/r/n”,inet_ntoa(sock.sin_addr),nowPort); WaitForSingleObject(hMutex,INFINITE);   
  46.   
  47. /*用WaitForSinleObject保证线程安全INFINITE表示一直等待,直到互斥体有信号*/  
  48. fp=fopen(pgscan→szFile,“a”);   
  49. fwrite(szResult,sizeof(char),strlen(szResult),fp);   
  50. fclose(fp);   
  51. pgscan→Result++;   
  52. ReleaseMutex(hMutex);//释放互斥体   
  53. closesocket(sk);//由于已经建立了连接,所以这里要关闭连接   
  54. sk=socket(AF_INET,SOCK_STREAM,0);//重新创建一个套接字