MFC中子线程进行网络连接,如何退出阻塞子线程

如题:想要实现的功能就是在子程序中进行TCP网络的连接,这是客户端,连接成功后就等待接收消息,接收到消息就发自定义消息给主线程操作。
直接贴代码:

void CsocketThreadDlg::InitSocket()
{
	//创建套接字
	MySocket = socket(AF_INET, SOCK_STREAM, 0);
	SOCKADDR_IN addrCar;
	addrCar.sin_family = AF_INET;
	addrCar.sin_port = htons(8118);
	USES_CONVERSION;
	char *ip = T2A(_T("127.0.0.1"));
	addrCar.sin_addr.S_un.S_addr = inet_addr(ip);

	pRecvParam.hwnd = m_hWnd;
	pRecvParam.sock = MySocket;
	pRecvParam.addr = addrCar;
	myThread = AfxBeginThread(MyThreadProc, (LPVOID)&pRecvParam);//启动子线程
}

因为是测试代码,所以IP就是回环IP
成员变量有:

	SOCKET MySocket;
	RECVPARAM pRecvParam;

下面是传入子线程的参数结构体:这是个全局的

struct RECVPARAM
{
	SOCKET sock;
	HWND hwnd;
	SOCKADDR_IN addr;
};

然后就是线程函数了:

UINT MyThreadProc(LPVOID pParam)
{
	char buff[2000];
	int n;
	SOCKET Client = ((RECVPARAM*)pParam)->sock;
	HWND  hWnd = ((RECVPARAM*)pParam)->hwnd;
	SOCKADDR_IN Addr = ((RECVPARAM*)pParam)->addr;

	if (SOCKET_ERROR == connect(Client, (SOCKADDR*)&Addr, sizeof(SOCKADDR)))
	{
		int nError = WSAGetLastError();
		CString strErrorMsg;
		SendMessage(hWnd, WM_NETERROR, 0, 0);
		return FALSE;
	}
	::SendMessage(hWnd, WM_NETCONNECTED, 0, 0);//网络连接成功

	while (TRUE)
	{  
	    memset(buff, 0, sizeof(buff));
		n = recv(Client, buff, sizeof(buff), 0);//阻塞,n是拷贝的字节数
		if (n == 0)//网络连接断开时,例如关闭服务器
		{
			SendMessage(hWnd, WM_NETERROR, 0, 0);
			return 0;
		}
		if (n == SOCKET_ERROR)
		{
			SendMessage(hWnd, WM_NETERROR, 0, 0);
			return 0;
		}
		::SendMessage(hWnd, WM_RECVDATA, (WPARAM)n, (LPARAM)buff);
	}
	return TRUE;
}

总的就是这样,可以正常连接网络,正常接收数据,就是在关闭程序的时候会发生内存泄漏,整个程序没有new任何东西,所以没有delete。
猜测原因是recv,是个阻塞函数,在主程序的onclose中发送关闭子程序的标志位和发送自定义关闭消息两种方式,都不能进入到子线程中去关闭,也试过sleep一定时间,请问有什么好的方式,关闭正在阻塞的子线程?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值