TCP文件传输MFC服务器篇

在VS2015下用对话框实现的网络文件传输,界面如下

开启服务器要实现的功能是:

1:加载socket库

2:创建socket

3:绑定服务器IP和端口

4:监听客服端的连接

5:设置异步套接字

开启服务器button的消息响应如下:

void CFileServerDlg::OnStratrun()
{
	// TODO: Add your control notification handler code here
	WORD ver = MAKEWORD(2, 0);
	WSADATA wsadata;
	if (WSAStartup(ver, &wsadata))
	{
		MessageBox(_T("load winsock dll failing"), _T("load"));
		return;
	}
	//create socket
	socket_server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (INVALID_SOCKET == socket_server)
	{
		MessageBox(_T("create socket failing"), _T("create"));
		return;
	}
	//bind socket
	sockaddr_in addr_server;
	memset(&addr_server, 0, sizeof(sockaddr_in));
	addr_server.sin_family = AF_INET;
	addr_server.sin_port = htons(10000);
	addr_server.sin_addr.S_un.S_addr = inet_addr("10.0.210.99");
	if (bind(socket_server, (sockaddr*)&addr_server, sizeof(sockaddr)))
	{
		MessageBox(_T("bind ip failed"), _T("bind"));
		return;
	}
	//listen client
	listen(socket_server, 5);

	//set
	WSAAsyncSelect(socket_server, this->m_hWnd, WM_SOCKET, FD_ACCEPT);//wrong in here
	GetDlgItem(IDC_STRATRUN)->EnableWindow(false);
//	MessageBox(_T("successful open"));
}
为了防止多次开启服务器操作,我这里一旦开启了服务器就把button设置为不可按了。

这里面socket_server是定义的socket成员变量,WM_SOCKET是自定义的消息响应。具体实现如下:

#pragma once
#define WM_SOCKET WM_USER+100

// CFileServerDlg dialog
class CFileServerDlg : public CDialogEx
protected:
	HICON m_hIcon;
	SOCKET socket_server;
	SOCKET socket_client;
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
LRESULT CFileServerDlg::OnSocket(WPARAM wParam, LPARAM lParam)
{
	if (LOWORD(lParam) == FD_ACCEPT)
	{
		//receive connect message
		sockaddr_in addr_client;
		memset(&addr_client, 0, sizeof(sockaddr_in));
		int length_addr = sizeof(sockaddr_in);
		socket_client = accept(socket_server, (sockaddr*)&addr_client, &length_addr);
		MessageBox(_T("success in creating connection"), _T("connect"));
		return TRUE;
	}
	return FALSE;
}
BEGIN_MESSAGE_MAP(CFileServerDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_STRATRUN, &CFileServerDlg::OnStratrun)
	ON_MESSAGE(WM_SOCKET,OnSocket)
	ON_BN_CLICKED(IDC_SENDFILE, &CFileServerDlg::OnSendfile)
	ON_BN_CLICKED(IDC_RECVFILE, &CFileServerDlg::OnRecvfile)
	ON_BN_CLICKED(IDCANCEL, &CFileServerDlg::OnBnClickedCancel)
END_MESSAGE_MAP()
接收文件button消息响应:

void CFileServerDlg::OnRecvfile()
{
	// TODO: Add your control notification handler code here
	//load to another file
	CFileDialog recv_dlg(false);
	if (IDOK == recv_dlg.DoModal())
	{
		CString file_path = recv_dlg.GetPathName();
		//create file on the defined path
		CFile file_recv(file_path, CFile::modeCreate | CFile::modeWrite);
		//receive file
		if (socket_client)
		{
			char recv_context[256]{ 0 };
			while (SOCKET_ERROR!=recv(socket_client, recv_context, 256, NULL))
			{
				//write content
				file_recv.Write(recv_context, sizeof(recv_context));
				memset(recv_context, 0, 256);
			}
		}
		//close file
		file_recv.Close();
		MessageBox(_T("receive successful"), _T("receive"));
	}
}
发送文件button消息响应:

void CFileServerDlg::OnSendfile()
{
	// TODO: Add your control notification handler code here
	//open file
	CFileDialog send_dlg(TRUE);
	if (IDOK == send_dlg.DoModal())
	{
		//get route 
		CString path_name = send_dlg.GetPathName();
		//crete file
		CFile file_context(path_name, CFile::modeRead);
		char context[256]{ 0 };
		//get content of file
		while (file_context.Read(context, 255))
		{
			if (SOCKET_ERROR == send(socket_client, context, 255, NULL))
			{
				MessageBox(_T("send failed"), _T("send"));
				return;
			}
			memset(context, 0, 256);
		}
		//close file
		file_context.Close();
		MessageBox(_T("send successful"), _T("send"));
	}
}
退出button消息响应:

void CFileServerDlg::OnBnClickedCancel()
{
	// TODO: Add your control notification handler code here
	closesocket(socket_server);//close server
	closesocket(socket_client);//close client
	WSACleanup();//unload socket
	CDialogEx::OnCancel();
}
在编译的过程中可能会出现一个问题,可能是这篇博客提出解决方案的问题; 点击打开链接

http://blog.csdn.net/thecentry/article/details/78955431
原代码链接如下:

http://download.csdn.net/download/thecentry/10188777









  • 2
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Class)是一种基于 Windows API 的 C++ 类库,可以轻松地创建 Windows 应用程序。TCP 是一种广泛应用于网络通信的协议,它提供了多个连接、可靠的数据传输和顺序控制等特性。MFC TCP 服务器与客户端的概念是将这两个技术结合起来,创建一种用于网络通信的应用程序。下面我们将对此进行详细的介绍。 MFC TCP 服务器的角色是提供服务,等待客户端连接,并接受来自客户端的数据请求,然后在一定的算法逻辑下,进行相应的处理,并将结果发送回给客户端。通常情况下,MFC TCP 服务器会监听一个端口,等待客户端的连接请求。当客户端连接到服务器时,服务器会将其添加到一个连接队列,并开启一个独立的线程来处理客户端请求。MFC TCP 服务器通常需要具备高并发、高可靠性、高性能等特点,以保证在高负载和恶劣环境下能够稳定运行。 MFC TCP 客户端的角色是连接服务器,并向其发送数据请求,接收并处理服务器返回的结果。通常情况下,MFC TCP 客户端需要先建立与服务器的连接,然后将需要传输的数据发送给服务器,等待服务器的响应,最后进行数据处理。与 MFC TCP 服务器不同,MFC TCP 客户端往往没有多线程的需求,但需要保证网络连接的可靠性和数据传输的正确性。 在实际应用中,MFC TCP 服务器和客户端被广泛用于网络通信领域。例如可以用于开发网络聊天室、实时数据传输系统、远程监控系统等。尽管 MFC TCP 服务器和客户端具有高并发、高可靠性和高性能等特点,但其也存在以下问题。首先,网络环境的复杂性会影响网络通信的稳定性。其次,开发者需要在线程、同步、异步等方面考虑周全,以避免因为网络通信引起的数据错误或程序崩溃等问题。因此,建议开发者在选择 MFC TCP 服务器和客户端进行应用程序开发时,应该充分考虑复杂性和可靠性等方面的问题,提前进行细致的规划和准备,以保证程序的可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值