MFC:TCP服务器端程序

1、首先定义变量

public:
	void StartListen();
	void StopListen();
	void ReceiveSendData();
	void CloseSock();
	void HandleData();
	SOCKET m_server;
	SOCKET m_listen;//监听

2、编写监听函数

void StartListen()
{
	//加载协议,使用winsock2.2版
	WSADATA wsd;
	WSAStartup(MAKEWORD(2,2),&wsd);
	//创建流式套接字
	m_listen=socket(AF_INET,SOCK_STREAM,0);

	//将网络中的事件关联到窗口的消息函数中,定义消息为20000,检测客户端的连接请求
	WSAAsyncSelect(m_listen,m_hWnd,20000,FD_ACCEPT);

	CString sIP="192.168.255.2";
	CString sPort="30003";
	//服务器地址
	sockaddr_in serveraddr;
	serveraddr.sin_family=AF_INET;
	serveraddr.sin_addr.S_un.S_addr = inet_addr(sIP);
	serveraddr.sin_port=htons(atoi(sPort));

	//绑定地址
	if(bind(m_listen,(sockaddr*)&serveraddr,sizeof(serveraddr)))
	{ 
		MessageBox("绑定地址失败");
		return;
	}

	//监听开始,服务器等待连接请求到来
	listen(m_listen,5);
	m_ListWords.AddString("监听开始");
	m_ListWords.AddString("地址"+sIP+"端口"+sPort);
	m_ListWords.AddString("等待客户连接");
}

3、监听消息事件

BOOL PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	CWnd *pWnd = NULL;
	int   nID = 0;          //< 保存获取的控件ID
	GX_STATUS status = GX_STATUS_SUCCESS;

	//判断是否是键盘回车消息
	if (WM_KEYDOWN == pMsg->message && VK_RETURN == pMsg->wParam)
	{
		//获取当前拥有输入焦点的窗口(控件)指针
		pWnd = GetFocus();

		//获取焦点所处位置的控件ID
		nID = pWnd->GetDlgCtrlID();

		//判断控件ID类型
		switch (nID)
		{

		//如果是曝光EDIT框的ID,设置曝光时间
		case IDC_EDIT_SHUTTER:

        //如果是增益EDIT框的ID,设置增益值
		case IDC_EDIT_GAIN:
			
			//失去焦点
			SetFocus();

			break;

		default:
			break;
		}

		return TRUE;
	}

	if ((WM_KEYDOWN == pMsg->message) && (VK_ESCAPE == pMsg->wParam))
	{
		return TRUE;
	}

	//添加的网络通信的消息事件
	if (pMsg->message==20000)
	{
		this->HandleData();

	}

	if(pMsg->message==30000)
	{
		switch(pMsg->lParam)
		{
		case FD_READ:
			this->ReceiveSendData();
			break;
		case FD_CLOSE:
			this->CloseSock();
			break;
		}
	}

	return CDialog::PreTranslateMessage(pMsg);
}

4、编写处理数据函数,接受客户端连接请求

void HandleData()
{
	sockaddr_in serveraddr;
	int len=sizeof(serveraddr);
	//接收客户请求
	m_server=accept(m_listen,(sockaddr*)&serveraddr,&len);
	//利用新创建的通信套接字检测客户端是否发来数据或者主动断开连接的事件
	WSAAsyncSelect(m_server,m_hWnd,30000,FD_READ|FD_CLOSE);

	m_ListWords.AddString("接受了一个客户端的连接请求");
	//界面完善
}

5、成功接受客户端连接后,开始读取并显示接受数据

void ReceiveSendData()
{   

	//接收客户端发来的内容,保存在字符数组receiveBuffer中
	int socklenServer=sizeof(serveraddr);
	int n=recv(m_server,receiveBuffer,sizeof(receiveBuffer),0);
	
	//对接收到的命令进行解析

	receiveBuffer[n] = '\0';

	if(n>0)
	{
		CString sTemp;
		sTemp.Format("收到:%s",receiveBuffer);
		//WSAAsyncSelect(m_client,m_hWnd,30000,FD_READ|FD_CLOSE);
		m_ListWords.AddString(sTemp);
		m_ListWords.SetTopIndex(m_ListWords.GetCount()-1);
	}
	//继续侦测服务器的动向
	WSAAsyncSelect(m_server,m_hWnd,30000,FD_READ|FD_CLOSE);

}

6、关闭socket

void CGxSingleCamMonoDlg::CloseSock()
{
	m_ListWords.AddString("客户端断开连接");
	//关闭与客户端通信的socket
	closesocket(m_server);
	//准备接收新的客户端连接
	WSAAsyncSelect(m_listen,m_hWnd,20000,FD_ACCEPT);
}

7、停止监听函数

void StopListen()
{
	closesocket(m_listen);
	m_ListWords.AddString("停止监听");
}

8、程序测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
Finish!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC(Microsoft Foundation Class)是微软提供的用于开发Windows桌面应用程序的类库。CAsyncSocket是MFC中用于实现异步套接字通信的类,可以用于构建TCP/IP服务器和客户端。 下面是一个简单的MFC CAsyncSocket服务器端代码示例: 1. 首先,在MFC应用程序中新建一个类,继承自CAsyncSocket类。我们称这个类为CSocketServer。 2. 在CSocketServer类的头文件中添加以下成员变量和函数声明: ``` class CSocketServer : public CAsyncSocket { public: CSocketServer(); virtual ~CSocketServer(); BOOL StartServer(UINT nPort); virtual void OnAccept(int nErrorCode); virtual void OnReceive(int nErrorCode); private: CAsyncSocket m_clientSocket; }; ``` 3. 在CSocketServer类的实现文件中添加以下相关功能的代码: ``` CSocketServer::CSocketServer() { } CSocketServer::~CSocketServer() { } BOOL CSocketServer::StartServer(UINT nPort) { // 创建服务端套接字 if (!Create(nPort, SOCK_STREAM)) { return FALSE; } // 监听端口 if (!Listen()) { return FALSE; } return TRUE; } void CSocketServer::OnAccept(int nErrorCode) { // 接受客户端连接请求 if (Accept(m_clientSocket)) { // 可在此处处理新客户端连接的逻辑 // 如继续监听客户端发送的数据等 // 设置该客户端套接字为异步套接字 m_clientSocket.AsyncSelect(FD_READ | FD_CLOSE); // 发送欢迎消息给客户端 CString strMsg = _T("Welcome to the server!"); m_clientSocket.Send(strMsg, strMsg.GetLength()); } CAsyncSocket::OnAccept(nErrorCode); } void CSocketServer::OnReceive(int nErrorCode) { // 从客户端接收数据 char buffer[1024] = { 0 }; int nRecv = m_clientSocket.Receive(buffer, 1024); if (nRecv > 0) { // 可在此处处理接收到的数据 // 如向客户端发送响应等 // 打印接收到的数据 CString strMsg(buffer, nRecv); TRACE(_T("Received: %s\n"), strMsg); } CAsyncSocket::OnReceive(nErrorCode); } ``` 4. 在MFC应用程序的主窗口类中,添加以下代码来启动服务器: ``` ... CSocketServer m_server; if (!m_server.StartServer(1234)) { // 启动服务器失败的处理逻辑 } ... ``` 上述代码中,CSocketServer类重写了CAsyncSocket类的OnAccept和OnReceive虚函数,以处理新客户端连接和接收数据的事件。StartServer函数用于创建服务器套接字并监听指定端口。当有客户端连接时,OnAccept函数会被调用;当有数据接收时,OnReceive函数会被调用。 这只是一个简单的示例代码,你可以根据实际需求来扩展和修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值