ctrldlg.cpp
来自「网络文件传输,用于显示屏控制系统」· C++ 代码 · 共 2,181 行 · 第 1/5 页
CPP
2,181 行
// ctrlDlg.cpp : implementation file
//
#include "stdafx.h"
#include "ctrl.h"
#include "ctrlDlg.h"
#include "pro_ser.h"
#include "Dlgchangtcport.h"
#include "Dlgchangudport.h"
#include "Dlgchangltd1.h"
#include "Dlgchangservertcport.h"
#include "Dlgchangserverudport.h"
#include "Dlgchangserverdns.h"
#include "Dlgcontcp.h"
#include "Dlginputltdpass.h"
#include "Dlgchangltdpass.h"
#include "Dlgopenlock.h"
#include "Dlgadduser.h"
#include "Dlgdeluser.h"
#include "Dlgchanguserpass.h"
#include "Dlgrename.h"
#include "Dlgdriatt.h"
#include "Dlgatt.h"
#include "Dlgrecoatt.h"
#include "Dlginsertable.h"
#include "Dlgtimerset.h"
#include "Dlgdispatt.h"
#include "Dlgupfile.h"
#include "Dlgsendctrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCtrlDlg dialog
SOCKET my_tcp_sock,my_udp_sock,tcp_acc_sock,pro_udp_sock;
struct sockaddr_in my_tcp_addr,my_udp_addr,pro_send_addr,pro_rec_addr;
SOCKET sock_arr[256];
CString strbufudp,strbuftcp,strpassword;
HTREEITEM ite[256];
unsigned char p_sock=0;
unsigned char p_sock_server=0;
unsigned int p_list_con=0;
BOOL flagudpsta=1;
BOOL flagtcpsta=1;
BOOL bit_flashdriver=0,bit_flashtable=0;
//BOOL bit_rec_table=0,bit_rec_dir=0,bit_rec_att=0;
unsigned char rec_dat[32*1024];
//unsigned char udp_dat[384*1024*1024/256];
unsigned char dat_sta=0;
CString m_newname;
CString m_oldname;
CString renamepath;
unsigned char arr_mis_pack[1600000];
#define no_re_sta '0' //未回应
#define re_sta '1' //有回应
unsigned char re_udp_pack_sta=re_sta;//接收状态请求标志
// re_udp_pack_sta=re_sta;
#define udp_dat_star '1' //未完成
#define udp_rec_fin '3' //传输完成
unsigned char flag_udp_send=udp_dat_star;//数据是否传输完成标志
unsigned char flag_udp; //发起请求标志
#define star '1' //udp 请求
#define f_connet '2' //udp 请求回应
BOOL bit_send_thread=0;
struct send_stru *head=NULL,*curr_send=NULL;
CWinThread *Threadrec_close;
unsigned char send_err_cou=0;
char send_dat[3*1024*1024];
unsigned char list_cou=0;
BOOL bit_timer_ctrl=0;
BOOL bit_stop_thread=0;
unsigned char timer_ctrl=0;
UINT tcp_close(LPVOID pParam)//接收tcp 数据
{
CCtrlDlg *pdlg = (CCtrlDlg *)pParam;
int sock_len = sizeof(sockaddr);
SOCKET recc_socket=tcp_acc_sock;
unsigned char buf_p=p_sock;
int rec_len;
CFile fil_send;
int sendedlen=0;
unsigned long pack_len;
unsigned long pack_cou=0;
stru_file_req *file_pack;
struct send_stru *my;
my=curr_send;
curr_send->sta=sending;
unsigned int file_len;
unsigned int read_len;
bit_send_thread=1;
CString strinf,name;
while(1)
{
rec_len=recv(recc_socket,(char *)rec_dat, 1600, 0);
if(bit_stop_thread)
{
bit_stop_thread=0;
pdlg->delitem(buf_p);
::closesocket(recc_socket);
fil_send.Close();
bit_send_thread=0;
return 1;
}
if(rec_len==SOCKET_ERROR)
{
pdlg->delitem(buf_p);
::closesocket(recc_socket);
fil_send.Close();
bit_send_thread=0;
bit_stop_thread=0;
return 1;
}
else
{
if((rec_dat[0]==0xaa)&&(rec_dat[1]==0x55))
{
timer_ctrl=0;
send_err_cou=0;
if(rec_dat[2]==file_dat)//数据请求
{
file_pack=(stru_file_req *)&rec_dat[0];
read_len=file_pack->pack_len;
if(file_pack->p_file_sock==my->p_send_sock)
{
int pges=(file_pack->pack_num)*pack_len/(file_len/100);
pdlg->m_gtcp.SetPos(pges+1);
if(file_pack->pack_num==pack_cou)//取出包号 如果不是顺序包
{
}
else
{
pack_cou=file_pack->pack_num;
fil_send.Seek(pack_cou*pack_len,CFile::begin);
}
//文件是否到尾包
fil_send.ReadHuge(send_dat,read_len);
sendedlen=send(recc_socket,(char *)&send_dat[0],read_len,0);
if(sendedlen==SOCKET_ERROR)
{
//发送中断
}
else
{
//发送成功
//返回长度不相等处理 最后的包
//设置进度条
pack_cou++;
}
}
// ::AfxMessageBox("dat");
}
else if(rec_dat[2]==file_req)//文件请求 第一次
{
stru_file *pro_file=(stru_file *)rec_dat;
pack_len=pro_file->pack_len;
CString strlen;
strlen.Format("%u",pro_file->p_file_sock);
BOOL bit_fail=0;
if(pro_file->p_file_sock==my->p_send_sock)
{
CString sorc_path=my->sour_path;
fil_send.Close();
int nastar=sorc_path.ReverseFind('\\');
int len=sorc_path.GetLength();
name.Empty();
for(int na=(nastar+1);na<len;na++)
{
name+=sorc_path.GetAt(na);
//sdpath+=path.GetAt(na);
}
if(fil_send.Open(sorc_path,CFile::modeRead))
{
file_len=fil_send.GetLength();
if(file_len<pack_len)
{
read_len=file_len;
}
else
{
read_len=pack_len;
}
fil_send.ReadHuge(send_dat,read_len);
/*
if(file_len<(64*1024))
{
fil_send.Read((void *)&send_dat[0],read_len);
}
else
{
fil_send.ReadHuge((void *)&send_dat[0],read_len);
}
*/
// char *data = new char[sendlen+1];//创建数据缓冲区
int idx=0;
int nrcvbuf=pack_len+1;
//SO_SNDBUF写缓冲,读缓冲为SO_RCVBUF
int err=setsockopt(recc_socket,SOL_SOCKET,SO_SNDBUF,(const char *)&nrcvbuf,sizeof(int));
if (err != NO_ERROR)
{
bit_fail=1;
::AfxMessageBox("opt");
}
else
{
strinf="开始发送"+name;
CString sttimer;
sttimer=pdlg->getcurrtimer();
strcpy((char *)my->start_timer,sttimer);
pdlg->addinf(strinf);
sendedlen=send(recc_socket,(char *)&send_dat[0],read_len,0);
if(sendedlen==SOCKET_ERROR)
{
bit_fail=1;
//发送中断
}
else
{
//发送成功
//返回长度不相等处理
//设置进度条
pack_cou++;
}
}
}
else
{
strinf="打开文件"+name+"失败";
//::AfxMessageBox(sorc_path);
pdlg->addinf(strinf);
my->sta=read_file_fail;
bit_fail=1;
}
if(bit_fail)
{
// ::AfxMessageBox("fail");
fil_send.Close();
pdlg->delitem(buf_p);
::closesocket(recc_socket);
bit_send_thread=0;
return 1;
}
}
}
else if(rec_dat[2]==file_fin)//完成
{
//::AfxMessageBox("fin");
bit_send_thread=0;
fil_send.Close();
::closesocket(recc_socket);
my->sta=send_ok;
pdlg->delitem(buf_p);
pdlg->m_gtcp.SetPos(100);
strinf="发送"+name+"完成";
//strinf="发送"+name;
CString sttimer;
sttimer=pdlg->getcurrtimer();
strcpy((char *)my->finish_timer,sttimer);
pdlg->addinf(strinf);
return 1;
}
}
}
}
return 1;
}
UINT tcp_rec(LPVOID pParam)//接收udp 数据
{
CCtrlDlg *pdlg = (CCtrlDlg *)pParam;
int rec_len;
unsigned long talon=0;
// char rec_tcp_dat[1600+1];
int len = sizeof(sockaddr);
unsigned char buf_p=p_sock;
SOCKET recc_socket=tcp_acc_sock;
int nrcvbuf=32*1024+1;
//写缓冲,读缓冲为SO_RCVBUF
int err=setsockopt(recc_socket,SOL_SOCKET,SO_RCVBUF,(const char *)&nrcvbuf,sizeof(int));
while(1)
{
//recv(tcp_acce_socket, recvbuf, 1500, 0);
rec_len=recv(recc_socket,(char *)&rec_dat[0], 32*1024, 0);
//rec_len=recvfrom(my_tcp_sock,rec_tcp_dat, 1600, 0,NULL, NULL);
if(rec_len==SOCKET_ERROR)
{
pdlg->delitem(buf_p);
return 1;
}
else
{
if((rec_dat[0]==0xaa)&&(rec_dat[1]==0x55))
{
pdlg->dowith_pro(recc_socket,rec_len,1,my_tcp_addr,buf_p);
}
// ::AfxMessageBox("red");
/*
CString str,strtime,strlen,st;
str.Empty();
pdlg->m_recedit=str;
strtime=pdlg->getcurrtimer();
talon+=rec_len;
strlen.Format("%u",talon);
str.Empty();
pdlg->getiport(buf_p);
str="TCP-recfrom:"+strbuftcp+','+strlen+"byte,T:"+strtime;
strbuftcp=str;
pdlg->updaterec_edit();
*/
}
}
return 1;
}
UINT acceptconnet(LPVOID pParam)//接受tcp连接
{
CCtrlDlg *pdlg = (CCtrlDlg *)pParam;
struct sockaddr_in tcp_acc_addr;
if(listen(my_tcp_sock,5))
{
AfxMessageBox("listen fail");
}
else
{
// AfxMessageBox("listen ok");
}
int nAddrLen = sizeof(struct sockaddr_in);
while(1)
{
tcp_acc_sock=accept(my_tcp_sock,(LPSOCKADDR) &tcp_acc_addr,&nAddrLen);
if(tcp_acc_sock< 0)
{
AfxMessageBox("accept fail");
return 1;
}
else
{
pdlg->isconnettcp(tcp_acc_sock,tcp_acc_addr);
}
}
}
UINT rec_pro(LPVOID pParam)//接收udp 数据
{
CCtrlDlg *pdlg = (CCtrlDlg *)pParam;
int rec_len;
// struct sockaddr_in udp_recv_addr;
//unsigned char rec_udp_dat[1600];
// unsigned long talon=0;
int len = sizeof(sockaddr);
while(1)
{
rec_len=recvfrom(pro_udp_sock,(char *)rec_dat, 1600, 0,(LPSOCKADDR)&pro_rec_addr, &len);
// rec_len=recvfrom(pro_udp_sock,(char *)&pro_ord.head0, 1600, 0,(LPSOCKADDR)&pro_rec_addr, &len);
// rec_len=recvfrom(my_udp_sock,rec_udp_dat, 1600, MSG_DONTROUTE,(LPSOCKADDR)&udp_recv_addr, &len);
// rec_len=recvfrom(my_udp_sock,rec_udp_dat, 1600, 0,NULL, NULL);
if(rec_len==SOCKET_ERROR)
{
AfxMessageBox("recbfrom pro err !");
return 1;
// WSACleanup();
}
else
{
if((rec_dat[0]==0xaa)&&(rec_dat[1]==0x55))
{
if(pro_rec_addr.sin_addr.S_un.S_un_b.s_b4!=my_udp_addr.sin_addr.S_un.S_un_b.s_b4)
{
pdlg->dowith_pro(pro_udp_sock,rec_len,0,pro_rec_addr,0);
}
}
else if((rec_dat[0]==0x55)&&(rec_dat[1]==0xaa))
{
}
}
}
return 1;
}
UINT udp_rec(LPVOID pParam)//接收udp 数据
{
CCtrlDlg *pdlg = (CCtrlDlg *)pParam;
int rec_len;
struct sockaddr_in udp_recv_addr;
// char rec_udp_dat[1600];
unsigned long talon=0;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?