其他线程如何正确关闭阻塞的Socket线程?

qq_24207981 2016-10-22 01:16:04
UINT DataRecvThreadProc(LPVOID lpParam)
{
C工具Dlg* aDlg = (C工具Dlg*)lpParam;//获取主对话窗的句柄!

int len;
CString str;
extern struct _TestNumRange TestNumRange;

if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return 1;
}

int nPort = TestNumRange.PortID;;

CSocket aSocket;
CSocket serverSocket;

if (!aSocket.Socket())
{
AfxMessageBox(_T("创建套接字错误!"));
return 1;
}

BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);

aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);


if (!aSocket.Bind(nPort))
{
AfxMessageBox(_T("绑定端口失败!"));
return 1;
}

if (!aSocket.Listen(5))
{
AfxMessageBox(_T("监听失败!"));
return 1;
}
while (m_connect)
{

if (!aSocket.Accept(serverSocket))
{
continue;
}
else
{
unsigned char szRecvMsg[17412] = { 0 };
while (1)
{
len = serverSocket.Receive(szRecvMsg, 17412);
if (!m_connect) break;
if (len == 0 || len == -1)
{
m_connect = false; Recv_Signal = false;
if (Recv_Signal) break;
serverSocket.Close();
aSocket.Close();
aDlg->m_pThread = NULL; //在这里把指针NULL掉会不会出错?
AfxMessageBox(_T("探头掉线!"));
return 0;
}
if (Recv_Signal)
{
global_CriticalSection.Lock();
frashfifo = true;
signalFIFO.Input(szRecvMsg, len);
global_CriticalSection.Unlock();
}
}
serverSocket.Close();
}
}

aSocket.Close();

return 0;
}




在界面上有两个按钮,启动按钮就是开启这个工作线程,而结束按钮我是这样写的:


m_connect = false; Recv_Signal = false;

::WaitForSingleObject(m_pThread->m_hThread, 1000);

m_pThread = NULL;

return;
但是这样关闭的话,有一种情况会出错:
当工作线程阻塞在
len = serverSocket.Receive(szRecvMsg, 17412);
的时候,若我按下启动按钮而在这1000ms内Socket没有接收到新的信号,则工作线程无法关闭,而只是把指针NULL了。
当我再开启工作线程时,就会出现两个Socket监听同一个端口的情况,这就会导致严重的后果。。。
因此,我想知道在这样的情况下我要怎么实现UI去控制工作线程的开关。
注:在实际使用中,serverSocket.Receive会有几种接收的情况:5ms一个包,一分钟一个包,因此如果用CEvent的话,我不知道应该怎么设计才能保证不掉包的同时能实现对工作线程的开关控制。
...全文
4168 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Pingo520 2017-02-15
  • 打赏
  • 举报
回复
你把1000改成无限等待不就可以了嘛
sczyq 2016-11-08
  • 打赏
  • 举报
回复
断开连接,让 Socket 产生异常
走好每一步 2016-11-07
  • 打赏
  • 举报
回复
用异步socket,不要用阻塞socket。 阻塞的socket只能自己给自己发个socket消息,不然。。。
qq_24207981 2016-10-25
  • 打赏
  • 举报
回复
不要沉啊。。 我找到一种方法就是在: if (!aSocket.Accept(serverSocket)) 改成try catch的结构,然后在界面线程需要关闭该线程时,产生一个线程中断,从而退出,问题是 我在mfc里面好像没有找到线程中断的方法。。

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧