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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值