Accept阻塞时,导致监听socket不能释放问题的解决方法:
采用Accept线程,专门开个线程去接收,在网络编程中,就是在receive端线程中开个accept线程去接收,可以解决阻塞问题,因为父线程结束了,子线程会被操作系统回收,不用我们做了,当然我们线程不能开太多,否则会出现malloc申请内存都出错。
- malloc:该函数分配给定的字节数,并返回一个指向它们的指针。如果没有足够的可用内存,那么它返回一个空指针。
部分代码说明:
//采用accept线程
if (flag)
{
HANDLE hAccept=CreateThread(0,0,AcceptWifiThread,(LPVOID)pDlg,0,0);
CloseHandle(hAccept);
flag=false;
}
DWORD WINAPI AcceptWireThread(LPVOID lpparam)
{
CRecieveFileDlg* pDlg = (CRecieveFileDlg*)lpparam;
if(pDlg == NULL)
return 0;
SOCKET Listening = pDlg->m_Listening;
sockaddr_in ClientAddr;//客户端的协议信息
int nLen = sizeof(sockaddr);
if (pDlg->m_connectWireSocket = accept(Listening,(sockaddr*)&ClientAddr,&nLen))
theApp.WriteProfileStringA("BreakIP","wire","");
return 0;
}