mfc c++-新人求教,我用mfc做了一个tcp fin的端口扫描器,死后得不出结果,求大神帮忙找出问题

问题描述

新人求教,我用mfc做了一个tcp fin的端口扫描器,死后得不出结果,求大神帮忙找出问题
cpp文件

// scanDlg.cpp : implementation file
//

#include ""stdafx.h""
#include ""scan.h""
#include ""scanDlg.h""
#include ""afxdialogex.h""

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();

// Dialog Data
enum { IDD = IDD_ABOUTBOX };

protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg CDialogEx)
END_MESSAGE_MAP()

// CscanDlg dialog

CscanDlg::CscanDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CscanDlg::IDD pParent)
m_star_port(_T(""""))
m_end_port(_T(""""))
m_IP(_T(""""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CscanDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX IDC_LIST1 m_list);
DDX_Text(pDX IDC_EDIT2 m_star_port);
DDX_Text(pDX IDC_EDIT3 m_end_port);
DDX_Text(pDX IDC_EDIT1 m_IP);
}

BEGIN_MESSAGE_MAP(CscanDlg CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1 &CscanDlg::OnBnClickedButton1)
END_MESSAGE_MAP()

// CscanDlg message handlers

BOOL CscanDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// Add ""About..."" menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){    BOOL bNameValid;    CString strAboutMenu;    bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);    ASSERT(bNameValid);    if (!strAboutMenu.IsEmpty())    {        pSysMenu->AppendMenu(MF_SEPARATOR);        pSysMenu->AppendMenu(MF_STRING IDM_ABOUTBOX strAboutMenu);    }}// Set the icon for this dialog.  The framework does this automatically//  when the application's main window is not a dialogSetIcon(m_hIcon TRUE);         // Set big iconSetIcon(m_hIcon FALSE);        // Set small icon// TODO: Add extra initialization herereturn TRUE;  // return TRUE  unless you set the focus to a control

}
hostent* CscanDlg::g_pHost = 0;
SOCKET CscanDlg::sock = 0;

void CscanDlg::OnSysCommand(UINT nID LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID lParam);
}
}

// If you add a minimize button to your dialog you will need the code below
// to draw the icon. For MFC applications using the document/view model
// this is automatically done for you by the framework.

void CscanDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

    SendMessage(WM_ICONERASEBKGND reinterpret_cast<WPARAM>(dc.GetSafeHdc()) 0);    // Center icon in client rectangle    int cxIcon = GetSystemMetrics(SM_CXICON);    int cyIcon = GetSystemMetrics(SM_CYICON);    CRect rect;    GetClientRect(&rect);    int x = (rect.Width() - cxIcon + 1) / 2;    int y = (rect.Height() - cyIcon + 1) / 2;    // Draw the icon    dc.DrawIcon(x y m_hIcon);}else{    CDialogEx::OnPaint();}

}

// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CscanDlg::OnQueryDragIcon()
{
return static_cast(m_hIcon);
}

void CscanDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
send_revc((LPSTR)(LPCTSTR)m_IP(LPSTR)(LPCTSTR)m_star_port(LPSTR)(LPCTSTR)m_end_port&m_list);//char ch1[]char tr1[]char tr2[]
}

void CscanDlg ::send_revc(char ch1[]char tr1[]char tr2[]CListBox* m_list)
{
WSADATA WSAData;
WSAStartup(MAKEWORD(22) &WSAData);
sock=WSASocket(AF_INETSOCK_RAWIPPROTO_RAWNULL0WSA_FLAG_OVERLAPPED);//定义套接字
BOOL flag = true;
setsockopt(sockIPPROTO_IP IP_HDRINCL(char )&flagsizeof(flag));
char sLocalName[64];
gethostname((char
)sLocalName sizeof(sLocalName)-1);
g_pHost = gethostbyname(sLocalName);
sockaddr_in addr_local;
addr_local.sin_addr = *(in_addr *)g_pHost->h_addr_list[0]; //绑定到本地网卡INADDR_ANY不行
addr_local.sin_family = AF_INET;//
addr_local.sin_port = htons(SOURCE_PORT);
bind(sock (PSOCKADDR)&addr_local sizeof(sockaddr_in));//绑套接字
DWORD dwValue = 1;
SADDR sAddr;
USHORT int1int2;
sAddr.m_destip=ch1;
sAddr.m_starpost=atoi(tr1);
sAddr.m_endpost=atoi(tr2);

ioctlsocket(sock SIO_RCVALL &dwValue);int  nTimeOut = 500;//设置超时setsockopt(sockSOL_SOCKET SO_SNDTIMEO (char*)&nTimeOut sizeof(nTimeOut));HANDLE threads[2];//开双线程threads[0] = CreateThread(NULL 0(LPTHREAD_START_ROUTINE)revcfunc(LPVOID)m_list0NULL);threads[1] = CreateThread(NULL 0(LPTHREAD_START_ROUTINE)sendfunc(LPVOID)(&sAddr) 0NULL);WaitForMultipleObjects(2threadsFALSEINFINITE); 

}
USHORT CscanDlg ::checksumfunc(USHORT buffer int size)//检验和函数
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size)
{
cksum += *(UCHAR
)buffer;
}

cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >>16);return (USHORT)(~cksum);}void CscanDlg ::sendfunc(SADDR* sAddr ){IP_HEADER ipHeader;TCP_HEADER tcpHeader;PSD_HEADER psdHeader;char Sendto_Buff[MAX_BUFF_LEN];  //发送缓冲区unsigned short check_Buff[MAX_BUFF_LEN]; //检验和缓冲区const char tcp_send_data[]={""This is my homework of networtI am happy!""};BOOL flag;int rectnTimeOver;//先试一下在外面弄好套接字初始化行不行flag=true;nTimeOver=1000;    //填充IP首部ipHeader.h_verlen=(IPVER<<4 | sizeof(ipHeader)/sizeof(unsigned long));ipHeader.tos=(UCHAR)0;ipHeader.total_len=htons((unsigned short)sizeof(ipHeader)+sizeof(tcpHeader)+sizeof(tcp_send_data));ipHeader.ident=0;       //16位标识ipHeader.frag_and_flags=0; //3位标志位ipHeader.ttl=128; //8位生存时间ipHeader.proto=IPPROTO_UDP; //协议类型ipHeader.checksum=0; //检验和暂时为0ipHeader.sourceIP=*(int*)g_pHost->h_addr_list[0];  //32位源IP地址可以直接获取ipHeader.destIP=inet_addr(sAddr->m_destip);    //32位目的IP地址//计算IP头部检验和memset(check_Buff0MAX_BUFF_LEN);memcpy(check_Buff&ipHeadersizeof(IP_HEADER));ipHeader.checksum=checksumfunc(check_Buffsizeof(IP_HEADER));//构造TCP伪首部psdHeader.saddr=ipHeader.sourceIP;psdHeader.daddr=ipHeader.destIP;psdHeader.mbz=0;psdHeader.ptcl=ipHeader.proto;psdHeader.tcpl=htons(sizeof(TCP_HEADER)+sizeof(tcp_send_data));for(int i=sAddr->m_starpost;i<sAddr->m_endpost;i++)//填充TCP首部{tcpHeader.th_dport=htons(i); //16位目的端口号tcpHeader.th_sport=htons(SOURCE_PORT); //16位源端口号tcpHeader.th_seq=0;                         //SYN序列号tcpHeader.th_ack=0;                         //ACK序列号置为0//TCP长度和保留位tcpHeader.th_lenres=(sizeof(tcpHeader)/sizeof(unsigned long)<<4|0);tcpHeader.th_flag=1; //修改这里来实现不同的标志位探测,2是SYN,1是//FIN,16是ACK探测 等等tcpHeader.th_win=htons((unsigned short)16384);     //窗口大小tcpHeader.th_urp=0;                            //偏移大小   tcpHeader.th_sum=0;                            //检验和暂时填为0//计算TCP校验和memset(check_Buff0MAX_BUFF_LEN);memcpy(check_Buff&psdHeadersizeof(psdHeader));memcpy(check_Buff+sizeof(psdHeader)&tcpHeadersizeof(tcpHeader));memcpy(check_Buff+sizeof(PSD_HEADER)+sizeof(TCP_HEADER)tcp_send_datasizeof(tcp_send_data));tcpHeader.th_sum=checksumfunc(check_Buffsizeof(PSD_HEADER)+sizeof(TCP_HEADER)+sizeof(tcp_send_data));//填充发送缓冲区memset(Sendto_Buff0MAX_BUFF_LEN);memcpy(Sendto_Buff&ipHeadersizeof(IP_HEADER));memcpy(Sendto_Buff+sizeof(IP_HEADER)&tcpHeadersizeof(TCP_HEADER));memcpy(Sendto_Buff+sizeof(IP_HEADER)+sizeof(TCP_HEADER)tcp_send_datasizeof(tcp_send_data));int datasize=sizeof(IP_HEADER)+sizeof(TCP_HEADER)+sizeof(tcp_send_data);//发送数据报的目的地址SOCKADDR_IN dest;   memset(&dest0sizeof(dest));dest.sin_family=AF_INET;dest.sin_addr.s_addr=inet_addr(sAddr->m_destip);dest.sin_port=htons(i);rect=sendto(sockSendto_Buffdatasize 0(struct sockaddr*)&dest sizeof(dest));}}void CscanDlg ::revcfunc(CListBox* m_list){CString str;char RecvBuf[MAX_BUFF_LEN]; IP_HEADER* ip;TCP_HEADER* tcp;     while(1)

{
int ret = recv(sock RecvBuf MAX_BUFF_LEN 0);
if (ret > 0)
{
ip = (IP_HEADER*)RecvBuf;
tcp = (TCP_HEADER*)(RecvBuf + (ip->h_verlen&0x0f)*4);
str.Format(_T(""%hu"") tcp->th_sport);
m_list->AddString(str);
}

else str.Format(_T(""%d"")ret)m_list->AddString(str);
}
}

头文件// scanDlg.h : header file
//

#pragma once
#include
#include
#include
#pragma comment(libws2_32.lib"")
//#define SIO_RCVALL_WSAIOW(IOC_VENDOR1)
#include
#include
#include
#include ""afxwin.h""
#define IPVER 4 //IP协议预定
#define MAX_BUFF_LEN 65500 //发送缓冲区最大值
#define SIO_RCVALL _WSAIOW(IOC_VENDOR1)
#define SOURCE_PORT 8088 //local TCP segment source port
// CscanDlg dialog
class CscanDlg : public CDialogEx
{
// Construction
public:
CscanDlg(CWnd* pParent = NULL); // standard constructor

// Dialog Data
enum { IDD = IDD_SCAN_DIALOG };
typedef struct ip_hdr //定义IP首部
{
UCHAR h_verlen; //4位首部长度4位IP版本号
UCHAR tos; //8位服务类型TOS
USHORT total_len; //16位总长度(字节)
USHORT ident; //16位标识
USHORT frag_and_flags; //3位标志位
UCHAR ttl; //8位生存时间 TTL
UCHAR proto; //8位协议 (TCP UDP 或其他)
USHORT checksum; //16位IP首部校验和
ULONG sourceIP; //32位源IP地址
ULONG destIP; //32位目的IP地址
}IP_HEADER;
typedef struct tsd_hdr //定义TCP伪首部
{
ULONG saddr; //源地址
ULONG daddr; //目的地址
UCHAR mbz; //没用
UCHAR ptcl; //协议类型
USHORT tcpl; //TCP长度
}PSD_HEADER;
typedef struct tcp_hdr //定义TCP首部
{
USHORT th_sport; //16位源端口
USHORT th_dport; //16位目的端口
ULONG th_seq; //32位序列号
ULONG th_ack; //32位确认号
UCHAR th_lenres; //4位首部长度/6位保留字
UCHAR th_flag; //6位标志位
USHORT th_win; //16位窗口大小
USHORT th_sum; //16位校验和
USHORT th_urp; //16位紧急数据偏移量
}TCP_HEADER;
typedef struct SADDR //定义TCP首部
{
char* m_destip;
USHORT m_starpost;
USHORT m_endpost;

};
USHORT static checksumfunc(USHORT buffer int size);
void static sendfunc(SADDR
sAddr);
void static revcfunc(CListBox* m_list);
void send_revc(char ch1[]char tr1[]char tr2[]CListBox* m_list);
SOCKET static sock; //用于收发TCP报文段的全局socket
hostent static *g_pHost;

protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

// Implementation
protected:
HICON m_hIcon;

// Generated message map functionsvirtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()

public:
CListBox m_list;
afx_msg void OnBnClickedButton1();
CString m_star_port;
CString m_end_port;
CString m_IP;
};

解决方案

OnBnClickedButton1中的调用阻塞了消息循环。把send_revc中的waitForMultiObjects函数去掉吧,可以使用afxbeginthread()开启线程,并设置CWinThread类的成员变量m_bAutoDelete为TRUE。或者设置等待窗口,等待线程完成。反正WaitForMuliObjects阻塞了消息循环,所以在revc线程中添加ListBox条目会被阻塞。

解决方案二:
楼主给个程序吧 谢谢 我们期末答辩时候要用啊,楼主好人 752162305@qq.com

解决方案三:
楼主这个程序可以给我一份吗?这周答辩要用,460334480@qq.com
楼主好人,好人一生平安

时间: 2025-01-02 15:47:31

mfc c++-新人求教,我用mfc做了一个tcp fin的端口扫描器,死后得不出结果,求大神帮忙找出问题的相关文章

数据-MFC文件操作问题,文件改写、插入、删除等等。求大神帮忙

问题描述 MFC文件操作问题,文件改写.插入.删除等等.求大神帮忙 问题有点繁琐,请耐心看完. 1.高速以太网接收数据,再把接收到的数据写入计算机文件. 2.接收到的数据要按时间先后顺序存放,每一个数据帧头都有时间序列 3.由于网络延时很大,有些后发送的数据帧先到达,已致接收到的数据包错乱 例如: 按时间序列先后有A.B.C三个数据帧依次发给计算机,现计算机收到数据帧先后顺序是A.C.B,计算机应该将数据存储成A.B.C 问题: 1.由于是高速传输数据量大,计算机不可能一直保存数据,等顺序正确后

win8-关于mysql的问题,百度上面很多方法我都照着做了,可是还是不行,求大神帮忙看看那

问题描述 关于mysql的问题,百度上面很多方法我都照着做了,可是还是不行,求大神帮忙看看那 我是win8的系统,下载的5.7.10版本,在官网上下载的zip. 有两个问题:1.我在my.ini文件中已经添加了 skip_grant_tables 但是 登陆的时候还是有错误,上图: 2.输入net start mysql启动不了 !图片说明 解决方案 mysql的系统服务是否注册成功,不然net start启动不了 数据库root用户密码是否配置正确 解决方案二: 你确定安装mysql有这么复杂

c语言-求大神帮忙 数据结构课程设计怎么做都运行不不起来,下周就要交了,拜托拜托T^T

问题描述 求大神帮忙 数据结构课程设计怎么做都运行不不起来,下周就要交了,拜托拜托T^T 输入文件中含有待格式化(或成为待排版)的文本,由多行文字组成.每一行由一系列被一个或多个空格符所隔开的字所组成,任何完整的字都没被分隔在两行,每行字数不超过80.除了上述文本类字符外,还存在起控制作用的字符:符号"@"指示它后面的正文在格式化时应另起一段排放,即空一行,并在段首缩入8个字符位置."@"自成一个字,一个文本格式化程序可以处理上述输入文件,按照用户指定的版面规格重排

关于做系统的问题,求大神帮忙看下~急

问题描述 关于做系统的问题,求大神帮忙看下~急 自己的电脑两块ssd 一个是win7 一个是ubantu14 但是在做ubantu的时候 安装系统的目标盘没改默认选择了win7那个盘(win7已经装好的,是thinkpad那种带recover分区的)安装了一分钟我强制重启,在打开win7发现没什么表现出来的问题 请教一下大神们 这会不会对win7有内部影响 导致系统不稳定什么的?怎么检测出由于失误安装的ubantu系统文件并删除呢? 解决方案 不可能啊,ubuntu不可能安装到ntfs分区上.

单片机-想做一个小制作,想像舞台上追光灯自动跟着信号发射器转这个原理,求大神帮忙

问题描述 想做一个小制作,想像舞台上追光灯自动跟着信号发射器转这个原理,求大神帮忙 想做一个小制作,想像舞台上追光灯自动跟着信号发射器转这个原理,求大神帮忙 解决方案 如果用js的话-可以考虑用three.js这个Webgl框架-网上有教程--很好用--实现3d或者平面效果都不错--楼主可以去搜搜 解决方案二: http://wenku.baidu.com/link?url=-4hQzyvforI53ZkhVYFfo7AlWhqX5cO738akk_DxxMTDeYXns5sLx4cInO7w7

网页网页,跪求大神。HTML加CSS做的网页二级界面,跪求大神帮忙。

问题描述 网页网页,跪求大神.HTML加CSS做的网页二级界面,跪求大神帮忙. HTML加CSS做的网页二级界面,跪求大神帮忙.HTML加CSS做的网页二级界面,跪求大神帮忙. 解决方案 问的什么问题 啊?具体你那里出现问题.

u-boot-u_boot的logo显示问题,求大神帮忙看看,做的我心都碎了

问题描述 u_boot的logo显示问题,求大神帮忙看看,做的我心都碎了 u-boot目录下所有关于Logo的文件都有,网上搜了一些说要在配置文件里添加配置语句,添加如下 #define CONFIG_CMD_BMP #define CONFIG_VIDEO #define CONFIG_VIDEO_LOGO #define CONFIG_VIDEO_BMP_LOGO #define VIDEO_FB_16BPP_WORD_SWAP 结果报错如图 解决方案 应该就那几个关于 FB 的, 参考 r

汇编-做对了 为什么提交不上去呢?求大神帮忙看下 奇数和偶数分离的问题

问题描述 做对了 为什么提交不上去呢?求大神帮忙看下 奇数和偶数分离的问题 #include //我感觉思路已经很清晰了 int main() { int array[10]; int arrayOdd[10][20]; int arrayEven[10][20]; int m , n , i , j; int Kodd=0,Keven=0; scanf("%d",&m); for( i = 1; i <= m; i++) { scanf("%d",&

数组-新人学习java,遇到 一个问题,求大神帮忙

问题描述 新人学习java,遇到 一个问题,求大神帮忙 一个整数数组有n个元素,能产生多少个差(元素之间可以相加).我知道每个元素有3种状态减数,被减数,或者根本没用,但在写程序时没感觉无法控制没用这个状态,求帮忙 解决方案 public static void main(String[] args) { //创建数据 int n = 6; //int [] arr = {1,2,3,4,5,6}; int []arr=new int[n]; List list=new ArrayList();