如题:想要实现的功能就是在子程序中进行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一定时间,请问有什么好的方式,关闭正在阻塞的子线程?