ctrldlg.cpp
来自「网络文件传输,用于显示屏控制系统」· C++ 代码 · 共 2,181 行 · 第 1/5 页
CPP
2,181 行
int len = sizeof(sockaddr);
while(1)
{
rec_len=recvfrom(my_udp_sock,(char *)rec_dat, 1600, 0,(LPSOCKADDR)&udp_recv_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 err !");
return 1;
// WSACleanup();
}
else
{
if((rec_dat[0]==0xaa)&&(rec_dat[1]==0x55))
{
if(rec_dat[2]==con_syn_udp)// 接收到 UDP请求 应答
{
re_udp_pack_sta=re_sta;
stru_file *prof=(stru_file *)rec_dat;
if(flag_udp==star)
{
flag_udp=f_connet;
}
}
else if(rec_dat[2]==com_ack)
{
re_udp_pack_sta=re_sta;
}
else if(rec_dat[2]==file_on)
{
re_udp_pack_sta=file_on;
}
else if(rec_dat[2]==sta_re)// 接收状态回复包
{
int p_t;
long p_arr;
//send_sta_req_cou=0; //复位状态请求次数
re_udp_pack_sta=re_sta;//置状态回复标志=有回应
p_t=rec_dat[3]*256+rec_dat[4];
for(int t=0;t<p_t;t++)
{
p_arr=rec_dat[t*3+5]*256*256+rec_dat[t*3+6]*256+rec_dat[t*3+7];
arr_mis_pack[p_arr]=f_mis;//写入状态阵列
}
}
else if(rec_dat[2]==udp_fin)// 接收完成回复包
{
flag_udp_send=udp_rec_fin;
}
else
{
pdlg->dowith_pro(my_udp_sock,rec_len,0,udp_recv_addr,0);
}
}
}
}
return 1;
}
UINT udp_send(LPVOID pParam)//发送udp 数据
{
CCtrlDlg *pdlg = (CCtrlDlg *)pParam;
if(head==NULL)
{
return 1;
}
/*
int nrcvbuf=1024*32;
//写缓冲,读缓冲为SO_RCVBUF
int err=setsockopt(my_udp_sock,SOL_SOCKET,SO_SNDBUF,(char *)&nrcvbuf,sizeof(nrcvbuf));
if (err != NO_ERROR)
{
return 1;
}
*/
CFile fil;
// struct sockaddr_in saDest;
struct send_stru *my;
my=head;
CString strip,strinf;
CString strport;
CString path,name;
BOOL sendok;
do
{
sendok=0;
if(my->sta==to_be_send)//是等待发送状态
{
//sendok=0;
//目的 端口、IP、文件路、名。写方式
//原路
flag_udp_send=udp_dat_star;
int cou;
//saDest.sin_addr.s_addr = *((u_long FAR *) (lpHost->h_addr));
path =my->sour_path;
CString sdpath=my->der_path;
int nastar=path.ReverseFind('\\');
int len=path.GetLength();
name.Empty();
for(int na=(nastar+1);na<len;na++)
{
name+=path.GetAt(na);
//sdpath+=path.GetAt(na);
}
sdpath=sdpath+'\\'+name;
if(!(fil.Open(path,CFile::modeRead)))
{
strinf="打开文件"+name+"失败";
pdlg->addinf(strinf);
}
else
{
cou=fil.GetLength();
//unsigned cha r re_udp_pack_sta;//接收状态请求标志
//#define no_re_sta '0' //未回应
//#define re_sta '1' //有回应
re_udp_pack_sta=no_re_sta;
//unsigned char flag_udp_send;//数据是否传输完成标志
//#define udp_dat_star '1' //未完成
//#define udp_rec_fin '3' //传输完成
BOOL send_star=1;
unsigned char send_sta_req_cou=0;
//stru_rec send;
stru_file file_pro;
file_pro.rec_head[0]=0xaa;
file_pro.rec_head[1]=0x55;
//file_pro.file_path
// file_pro.file_mode
file_pro.file_len=cou;
file_pro.rec_pro=acc_syn_udp;
strcpy((char *)file_pro.file_path,sdpath);
//file_pro.file_len=cou;
file_pro.file_mode=my->send_mode;
flag_udp=star;
// flag_udp_send=udp_fin;
if(send(sock_arr[my->p_send_sock],(const char *)&file_pro.rec_head,sizeof(stru_file)+1,0)==SOCKET_ERROR)
{
//该屏已断开
::AfxMessageBox("seep");
strinf=strip+"已断开";
my->sta=noip;
pdlg->addinf(strinf);
}
else
{
BOOL re_ok=0;
for(unsigned int recfla=0;recfla<300;recfla++)
{
Sleep(10);//循环检测有回应
if(re_udp_pack_sta!=no_re_sta)
{
if(re_udp_pack_sta==file_on)
{
strinf="文件"+name+"已存在";
my->sta=fileon;
pdlg->addinf(strinf);
}
else
{
re_ok=1;
}
recfla=301;
}
}
if(re_ok)//协商成功
{
SOCKET tcp_con_sock;
struct sockaddr_in my_addr,con_addr;
if((tcp_con_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))<0)
{
AfxMessageBox("tcp sock err !");
}
BOOL val;
val = TRUE;
//SO_REUSEADDR选项就是可以实现端口重绑定的
if(setsockopt(tcp_con_sock,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
{
AfxMessageBox("error!setsockopt failed!\n");
return 1;
}
my_addr.sin_family = AF_INET; // destination address
//my_addr.sin_port = (int) changport(m_tcport);
my_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if(SOCKET_ERROR ==bind(tcp_con_sock,(LPSOCKADDR)&my_addr, sizeof(sockaddr)))
{
AfxMessageBox("bind tcp socket error !");
closesocket(tcp_con_sock);
WSACleanup();
//EndDialog(0);
return 1;
}
else
{
// AfxMessageBox("bind socket ok !");
}
con_addr.sin_family = AF_INET;
strport=(CString)my->port;
con_addr.sin_port =ntohs((unsigned short)atoi(strport));
//con_addr.sin_port+=1;
strip=(CString)my->ip_addr;
con_addr.sin_addr.S_un.S_addr=inet_addr(strip);
/*
unsigned long lon=inet_addr(strip);//转换ip字符串为32bit
con_addr.sin_addr.S_un.S_un_b.s_b1=(unsigned char)lon;
con_addr.sin_addr.S_un.S_un_b.s_b2=(unsigned char)(lon>>8);
con_addr.sin_addr.S_un.S_un_b.s_b3=(unsigned char)(lon>>16);
con_addr.sin_addr.S_un.S_un_b.s_b4=(unsigned char)(lon>>24);
con_addr.sin_port = (int)changport(strport);
*/
if(connect(tcp_con_sock, (LPSOCKADDR)&con_addr,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
{
my->sta=noip;
AfxMessageBox("连接失败!\b\r该屏已断开或者已建立连接");
// pdlg->set_stabar("连接失败!\b\r该屏已断开或者已建立连接");
}
else
{
tcp_acc_sock=tcp_con_sock;
pdlg->close_tcp();
//::Sleep(300);
strinf="开始发送"+name;
CString sttimer;
sttimer=pdlg->getcurrtimer();
strcpy((char *)my->start_timer,sttimer);
pdlg->addinf(strinf);
// int sendlen=1024*1024*3;
int sendlen=1024*31;
char *data = new char[sendlen+1];//创建数据缓冲区
//void far *p=::GlobalAlloc(0,cou);
/*
if(p==NULL)
{
}
else
{
*/
// DWORD relen=fil.ReadHuge(data,cou);
/*
CString re;
re.Format("%u",relen);
::AfxMessageBox(re);
*/
int idx=0;
int nrcvbuf=sendlen+1;
//SO_SNDBUF写缓冲,读缓冲为SO_RCVBUF
int err=setsockopt(tcp_con_sock,SOL_SOCKET,SO_SNDBUF,(const char *)&nrcvbuf,sizeof(int));
if (err != NO_ERROR)
{
::AfxMessageBox("setsockopt err");
return 1;
}
CString str;
int filen=0;
//int packlen=1024*1024*2;
int tatolen=cou;
int pges;
while(cou>0)
{
if(cou>sendlen)
{
filen=sendlen;
}
else
{
filen=cou;
}
fil.ReadHuge(&data[0],filen);
int sendlen=send(tcp_con_sock,&data[0],filen,0);
if(sendlen==SOCKET_ERROR)
{
//发送中断
my->sta=noip;
strinf="无法发送"+name+"到"+strip+' '+strport;
// pdlg->set_stabar(strinf);
pdlg->addinf(strinf);
cou=0;
}
else
{
idx+=sendlen;
cou-=sendlen;
my->sta=sending;
//str.Format("%u",sendlen);
// AfxMessageBox(str);
pges=(tatolen-cou)*100/tatolen;
pdlg->m_gtcp.SetPos(pges+1);
str.Format("%u",pges);
strinf="发送"+name+"到"+strip+' '+strport+' '+str+'%';
// pdlg->strsta=strinf;
// pdlg->set_stabar(strinf);
if(tatolen>idx)
{
}
else
{
if(tatolen==idx)
{
re_udp_pack_sta=no_re_sta;
for(unsigned int recfla=0;recfla<900;recfla++)
{
Sleep(10);//循环检测有回应
if(re_udp_pack_sta!=no_re_sta)
{
if(re_udp_pack_sta==udp_fin)
{
my->sta=send_ok;
sttimer=pdlg->getcurrtimer();
strcpy((char *)my->finish_timer,sttimer);
strinf="发送"+name+"到"+strip+' '+strport+' '+"完成";
pdlg->m_gtcp.SetPos(100);
// pdlg->set_stabar(strinf);
pdlg->addinf(strinf);
//·0-------不允许继续接收数据 //·1-------不允许继续发送数据 //·2-------不允许继续发送和接收数据,均为允许则调用close ()
// ::shutdown(tcp_con_sock,2);
unsigned char cha[6];
cha[0]=0xaa;
cha[1]=0x55;
cha[2]=fil_fin_ack;
if(send(sock_arr[my->p_send_sock],(const char *)cha,5,0)==SOCKET_ERROR)
{
}
::closesocket(tcp_con_sock);
}
recfla=901;
cou=0;
}
}
}
else
{
my->sta=breaked;
strinf="发送"+name+"到"+strip+' '+strport+' '+"中断";
// pdlg->set_stabar(strinf);
pdlg->addinf(strinf);
}
}
}
}
fil.Close();
::delete [] data;
// shutdown(tcp_con_sock,2);
::closesocket(tcp_con_sock);
}//连接成功
}//协商成功
}//发送 协商成功
}//打开文件成功
}//是等待发送状态
//del=my;
fil.Close();
my=my->next;
// pdlg->m_gtcp.SetPos(0);
// head=my;
/*
if(sendok)
{
strinf="发送"+name+"到"+strip+' '+strport+' '+"完成";
pdlg->addinf(strinf);
}
*/
}while(my!=NULL);
// head=NULL;
bit_send_thread=0;
return 1;
}
CCtrlDlg::CCtrlDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCtrlDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCtrlDlg)
m_server = _T("");
m_server_tcport = _T("");
m_server_udport = _T("");
m_tcport = _T("");
m_udport = _T("");
m_ltd = _T("");
m_ip = _T("");
m_name = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCtrlDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCtrlDlg)
DDX_Control(pDX, IDC_PROGRESS1, m_gtcp);
DDX_Control(pDX, IDC_PLAYFILESIZE, m_currsize);
DDX_Control(pDX, IDC_PLAYFILENAME, m_currname);
DDX_Control(pDX, IDC_PLAYFILESERI, m_currseri);
DDX_Control(pDX, IDC_EDIT1, m_edit);
DDX_Control(pDX, IDC_TREE2, m_treedir);
DDX_Control(pDX, IDC_LIST1, m_listtable);
DDX_Control(pDX, IDC_LIST4, m_listcon);
DDX_Control(pDX, IDC_TREE1, m_tree);
DDX_Text(pDX, IDC_SERVER, m_server);
DDX_Text(pDX, IDC_SERVER_TCPORT, m_server_tcport);
DDX_Text(pDX, IDC_SERVER_UDPORT, m_server_udport);
DDX_Text(pDX, IDC_TCPORT, m_tcport);
DDX_Text(pDX, IDC_UDPORT, m_udport);
DDX_Text(pDX, IDC_LTD, m_ltd);
DDX_Text(pDX, IDC_IP, m_ip);
DDX_Text(pDX, IDC_NAME, m_name);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCtrlDlg, CDialog)
//{{AFX_MSG_MAP(CCtrlDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(ID_TBSTARTCP, OnTbstartcp)
ON_COMMAND(ID_TBSTARTUDP, OnTbstartudp)
ON_COMMAND(ID_TBSTOPTCP, OnTbstoptcp)
ON_COMMAND(ID_TBSTOPUDP, OnTbstopudp)
ON_COMMAND(IDC_MENUSTARTCP, OnMenustartcp)
ON_COMMAND(IDC_MENUSTARUDP, OnMenustarudp)
ON_COMMAND(IDC_MENUSTOPTCP, OnMenustoptcp)
ON_COMMAND(IDC_MENUSTOPUDP, OnMenustopudp)
ON_COMMAND(ID_MENUCHANGTCPORT, OnMenuchangtcport)
ON_COMMAND(ID_MENUCHANGUDPORT, OnMenuchangudport)
ON_COMMAND(ID_MENUCHANGLTD, OnMenuchangltd)
ON_COMMAND(IDC_MENUCHANGSERVERDNS, OnMenuchangserverdns)
ON_COMMAND(IDC_MENUCHANGSERVERTCPORT, OnMenuchangservertcport)
ON_COMMAND(IDC_MENUCHANGSERVERUDPORT, OnMenuchangserverudport)
ON_NOTIFY(NM_RCLICK, IDC_TREE1, OnRclickTree1)
ON_NOTIFY(NM_CLICK, IDC_TREE1, OnClickTree1)
ON_COMMAND(IDC_MENUREFLASHSERVER, OnMenureflashserver)
ON_COMMAND(IDC_MENUTCPCONNET, OnMenutcpconnet)
ON_COMMAND(IDC_MENUCHANGLTDPASS, OnMenuchangltdpass)
ON_COMMAND(IDC_POPMENU2FLASH, OnPopmenu2flash)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?