mfc socket简单编程-服务器端(没成功)

这几天准备开始做socket,先做的服务器端。虽然有一行代码一直不成功,但是还是把代码放上来吧。(我会把不成功的地方标上的。)先把我准备设计的界面图片放上来。
设计的界面

我是用了一个连接按钮触发的。因为网上没有很好的答案,所以我拼接了半天代码——都没做成功。(在此感谢提供代码的几位)
(我在这里顺便说一句:一开始我想直接在网上找一个现成的,可是后来才发现,网上的代码和一些东西不一定都对你有帮助,因为它们有一些是被多次复制粘贴组成的。)

我先把按钮的响应代码放上。

void CsockettestDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	//初始化Winscok
	if (!AfxSocketInit())
	{
		AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
	}
 

	//获取端口
	CString strPort;
	GetDlgItemText(IDC_EDIT_PORT, strPort);
	UINT nPort = atoi((char *)(LPCTSTR)strPort);
	
	//socket----创建2个socket--------------------------------------------

	//最好不要使用aSocket.Create创建,因为容易会出现10048错误
	if (!aSocket.Socket())
		AfxMessageBox(L"创建失败。");
 
	BOOL bOptVal = TRUE;
	int bOptLen = sizeof(BOOL);
	//设置Socket的选项, 解决10048错误必须的步骤
	aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);
	
	 //绑定
	if (!aSocket.Bind(nPort))
		AfxMessageBox(L"绑定失败。");

	//监听
	if(!aSocket.Listen(10))
		AfxMessageBox(L"监听失败。");
	
	CString strText;
	GetDlgItemText(IDC_EDIT_LOG, strText);
	strText += "服务已经开启! \r\n";
	SetDlgItemText(IDC_EDIT_LOG, strText);
	HANDLE hThread;
	hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)listenFunc,NULL,0,NULL);
	
}

上面不是有一个CreateThread里的listenFunc吗,我再把listenFunc的代码放上去。不过这里面有一行出了一点问题,我还没解决。**虽然每次编译都成功了,但是那个地方每次运行都会报内存泄漏。**情况发个图错误情况
在放上代码之前,解释一下上图最左边的字母是截屏多出了一块。

void listenFunc()//线程函数
{
	CWnd* m_h=AfxGetApp()->GetMainWnd();
	SOCKADDR saddr;
	int retn =serverSocket.Accept(aSocket,&saddr);		//此处有问题  内存泄漏
	while(m_bRun)
	{
		//接收外部连接
		if(retn==1)
		{
			CString strText;
			char szRecvMsg[100] = {0};
			char szOutMsg[256] = {0};	
			serverSocket.Receive(NULL, 0); //接收客户端内容:阻塞
			sprintf(szOutMsg, "接受到的参数是: %s \r\n", szRecvMsg);
			m_h->GetDlgItem(IDC_EDIT_LOG)->GetWindowText(strText);
			strText += szOutMsg;
			m_h->GetDlgItem(IDC_EDIT_LOG)->SetWindowText(strText);
			serverSocket.Send("服务器已经收到,已经做出操作!", 50);//发送内容给客户端
		}
		
	}
}

错误在第五行,我标出来了。问题还没解决,谁会解决的话请在下面留言一下,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个服务器对多个客户端的MFC Socket编程示例(实现简单的即时通讯功能) 环境:Windows XP SP3、 VC++ 6.0、 Windows 2003 SDK 使用步骤: 1、下载解压之后,使用VC++ 6.0打开两个工程:一个是SocketServer和一个ClientSocket工程。 2、首先运行服务器端工程,选默认的端口1008 3、然后运行客户端工程,选默认的端口1008和默认的服务器地址 4、再运行多个客户端进程 5、如果一切正常,可以每个客户端的消息发送,我们可以在服务端和各个客户端同步看到消息 实现一个服务器对多个客户端的关键是,在服务端的使用集合CPtrList类用保存客户端的socket对象,思想与Java中的编程思想一样,只不过Java中会使用多线程技术,在Vector集合保存客户端的socket对象 ,而MFC框架提供了CSocket类,它是一个异步通信的类,所以看上去代码比较Java的多线程代码简单的实现了一个对多的即时通讯功能。另外,MFC提供了CSocketFile类和CArchive类与CSocket类实现了C++的网络通讯编程功能。 本示例注释非常详细,所有的辅助类都放一个util目录中,然后在工程中分了一个目录来管理这些辅助类,使用代码非常清晰。手动书写部分的代码是按Java的规范书写,当然其它代码由IDE生成的,所以是MS的风格,所以当你看代码时,只要是使用“骆驮命名法”的方法都是本人书写的功能性代码。 参看的思路:在服务端要从回调方法onAccept读起;而客户端代码主要从OnSendButton方法读起,即可理解整个代码的意思。 阅读对象:具有Java的Socket编程经验的人员,并且希望能够书写出比Java效率更高的即时通讯程序的人员

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值