⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mymessengerdlg.cpp

📁 点对点聊天与传文件程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			UpdateData(FALSE);
		}
	}
}

void CMyMessengerDlg::OnReceive()      //收到消息或文件
{
	if (m_ftype==0)                    //如果是消息
	{
		char *p=new char[1025];
		int iRcvd;
		CString str;
		iRcvd=m_ConnectSocket.Receive(p,1024);
		if (iRcvd==SOCKET_ERROR)
		{
		}
		else
		{
			p[iRcvd]=NULL;
			str=p;
			m_lreceived.AddString(str); //在列表框received中显示消息
			UpdateData(FALSE);
		}
	}
	else                              //如果是文件
	{
		MessageBox("收到对方传送文件请求,请按\"接收文件\"将其保存到本机");
		UpdateData(TRUE);
	/*	int dataLen;
		m_ConnectSocket.Receive(&dataLen,4);
		byte *data=new byte[dataLen];
		m_ConnectSocket.Receive(data,dataLen);
		CFile destFile(m_receivefilename,CFile::modeCreate|CFile::modeWrite);
		destFile.Write(data,dataLen);
		destFile.Close();
		delete data;*/
	}
}


void CMyMessengerDlg::OnClose()     //报路事件:OnClose
{
	if (m_itype==0)     //如果是客户端知道另一边Close了,应该作出反应
	{
		m_ConnectSocket.Close();
	    GetDlgItem(IDC_MESSAGETYPE)->EnableWindow(FALSE);
	    GetDlgItem(IDC_FILETYPE)->EnableWindow(FALSE);
		GetDlgItem(IDC_EMSG)->EnableWindow(FALSE);
		GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);
		GetDlgItem(IDC_BCLOSE)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BADDSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_ADDRECEIVEFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_RECEIVEFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
		MessageBox("与服务器的连接被断开,请重试!");
		GetDlgItem(IDC_BCONNECT)->EnableWindow(TRUE);
		GetDlgItem(IDC_ADDRESS)->EnableWindow(TRUE);
		GetDlgItem(IDC_PORT)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLIENT)->EnableWindow(TRUE);
		GetDlgItem(IDC_SERVER)->EnableWindow(TRUE);
		GetDlgItem(IDC_BCLOSE)->EnableWindow(FALSE);
	}            
	else      //如果是服务器知道另一边close了,则回到侦听状态
	{
		m_ConnectSocket.Close();
		m_ListenSocket.Listen();
	    GetDlgItem(IDC_MESSAGETYPE)->EnableWindow(FALSE);
	    GetDlgItem(IDC_FILETYPE)->EnableWindow(FALSE);
		GetDlgItem(IDC_EMSG)->EnableWindow(FALSE);
	    GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BADDSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_ADDRECEIVEFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_RECEIVEFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BCLOSE)->EnableWindow(TRUE);
	    MessageBox("对方已断开连接,服务器现继续等待连接!");
	}
}

void CMyMessengerDlg::OnBclose() 
{
	// TODO: Add your control notification handler code here
	if (m_itype==0)             //客户端主动关闭连接
	{
		m_ConnectSocket.Close();
	    GetDlgItem(IDC_MESSAGETYPE)->EnableWindow(FALSE);
	    GetDlgItem(IDC_FILETYPE)->EnableWindow(FALSE);
		GetDlgItem(IDC_EMSG)->EnableWindow(FALSE);
		GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);
		GetDlgItem(IDC_BCLOSE)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BADDSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_ADDRECEIVEFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_RECEIVEFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BCONNECT)->EnableWindow(TRUE);
		GetDlgItem(IDC_ADDRESS)->EnableWindow(TRUE);
		GetDlgItem(IDC_PORT)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLIENT)->EnableWindow(TRUE);
		GetDlgItem(IDC_SERVER)->EnableWindow(TRUE);
		GetDlgItem(IDC_BCLOSE)->EnableWindow(FALSE);
		MessageBox("与服务器的连接已关闭!");
	} 
	else                       //服务器端主动关闭连接
	{
		m_ListenSocket.Close();
		m_ConnectSocket.Close();
	    GetDlgItem(IDC_MESSAGETYPE)->EnableWindow(FALSE);
	    GetDlgItem(IDC_FILETYPE)->EnableWindow(FALSE);
		GetDlgItem(IDC_EMSG)->EnableWindow(FALSE);
		GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);
		GetDlgItem(IDC_BCLOSE)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BADDSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_ADDRECEIVEFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_RECEIVEFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BCONNECT)->EnableWindow(TRUE);
		GetDlgItem(IDC_ADDRESS)->EnableWindow(TRUE);
		GetDlgItem(IDC_PORT)->EnableWindow(TRUE);
		GetDlgItem(IDC_CLIENT)->EnableWindow(TRUE);
		GetDlgItem(IDC_SERVER)->EnableWindow(TRUE);
		GetDlgItem(IDC_BCLOSE)->EnableWindow(FALSE);
		MessageBox("服务器已关闭!");
	}
}

void CMyMessengerDlg::OnServer()      //服务器or客户端
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	if (m_itype==0)
	{
		m_bclose.SetWindowText("断开连接");
		m_bconnect.SetWindowText("连接");
		GetDlgItem(IDC_ADDRESS)->EnableWindow(TRUE);
	}
	else
	{
		m_bconnect.SetWindowText("开启服务");
		m_bclose.SetWindowText("关闭服务");
		GetDlgItem(IDC_ADDRESS)->EnableWindow(FALSE);
	}
}

void CMyMessengerDlg::OnOK()          //重载OnOK函数
{
	UpdateData(TRUE);
	if (m_ftype==0)
	{
		OnBsend();
	}
}

void CMyMessengerDlg::GetIPAddress()   //获取本机信息
{
	gethostname(LocalHostName,sizeof(LocalHostName));
	struct hostent FAR *lpHostEnt=gethostbyname(LocalHostName);
	LPSTR lpAddr=lpHostEnt->h_addr_list[0];
	if (lpAddr)
	{
		struct in_addr inAddr;
		memmove(&inAddr,lpAddr,4);
		LocalIPAddress=inet_ntoa(inAddr);
	}
}

void CMyMessengerDlg::OnBreceive()       //接收文件
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	int dataLen;
	m_ConnectSocket.Receive(&dataLen,4);
	byte *data=new byte[dataLen];
	m_ConnectSocket.Receive(data,dataLen);
	CFile destFile(m_receivefilename,CFile::modeCreate|CFile::modeWrite);
	destFile.Write(data,dataLen);
	destFile.Close();
	delete data;
	MessageBox("文件传送完毕,请查看!");
}

void CMyMessengerDlg::OnBaddsendfile() 
{                           //浏览输入要发送的文件名
	// TODO: Add your control notification handler code here
	CFileDialog filedlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,"All Files (*.*)|*.*||",NULL);
	filedlg.m_ofn.lpstrFile = new char[1024];
	filedlg.m_ofn.lpstrFile[0]='\0';
	filedlg.m_ofn.nMaxFile=1024;
	if(filedlg.DoModal()==IDOK)
	{
		POSITION pos=filedlg.GetStartPosition();
		int i=0;
		while(pos)
		{
			CString temp=filedlg.GetNextPathName(pos);
			m_sendfilename=temp;
		}
	}
	UpdateData(FALSE);
	delete[] filedlg.m_ofn.lpstrFile;
}

void CMyMessengerDlg::OnAddreceivefile() 
                                 //浏览输入存放接收到的文件的路径
{
	// TODO: Add your control notification handler code here
	CFileDialog filedlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,"All Files (*.*)|*.*||",NULL);
	filedlg.m_ofn.lpstrFile = new char[1024];
	filedlg.m_ofn.lpstrFile[0]='\0';
	filedlg.m_ofn.nMaxFile=1024;
	if(filedlg.DoModal()==IDOK)
	{
		POSITION pos=filedlg.GetStartPosition();
		int i=0;
		while(pos)
		{
			CString temp=filedlg.GetNextPathName(pos);
			m_receivefilename=temp;
		}
	}
	UpdateData(FALSE);
	delete[] filedlg.m_ofn.lpstrFile;
}

void CMyMessengerDlg::OnBsendfile()         //传送文件
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	CFile myFile;
	myFile.Open(m_sendfilename,CFile::modeRead);
	int myFileLen=myFile.GetLength();
	m_ConnectSocket.Send(&myFileLen,4);
	byte *data=new byte[myFileLen];
	myFile.Read(data,myFileLen);
	m_ConnectSocket.Send(data,myFileLen);
	myFile.Close();
	delete data;
}

void CMyMessengerDlg::OnMessagetype()       //消息 or 文件
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	if (m_ftype==0)
	{
		GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
		GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
		GetDlgItem(IDC_SENDFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BADDSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_ADDRECEIVEFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_RECEIVEFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
	}
	else
	{
		GetDlgItem(IDC_EMSG)->EnableWindow(FALSE);
		GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDFILENAME)->EnableWindow(TRUE);
		GetDlgItem(IDC_BADDSENDFILE)->EnableWindow(TRUE);
		GetDlgItem(IDC_ADDRECEIVEFILE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BSENDFILE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(TRUE);
		GetDlgItem(IDC_RECEIVEFILENAME)->EnableWindow(TRUE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(TRUE);
	}	
}

void CMyMessengerDlg::OnFiletype() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	if (m_ftype==0)
	{
		GetDlgItem(IDC_EMSG)->EnableWindow(TRUE);
		GetDlgItem(IDC_BSEND)->EnableWindow(TRUE);
		GetDlgItem(IDC_SENDFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BADDSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_ADDRECEIVEFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BSENDFILE)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
		GetDlgItem(IDC_RECEIVEFILENAME)->EnableWindow(FALSE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(FALSE);
	}
	else
	{
		GetDlgItem(IDC_EMSG)->EnableWindow(FALSE);
		GetDlgItem(IDC_BSEND)->EnableWindow(FALSE);
		GetDlgItem(IDC_SENDFILENAME)->EnableWindow(TRUE);
		GetDlgItem(IDC_BADDSENDFILE)->EnableWindow(TRUE);
		GetDlgItem(IDC_ADDRECEIVEFILE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BSENDFILE)->EnableWindow(TRUE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(TRUE);
		GetDlgItem(IDC_RECEIVEFILENAME)->EnableWindow(TRUE);
		GetDlgItem(IDC_BRECEIVE)->EnableWindow(TRUE);
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -