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的話,我不知道應該怎么設計才能保證不掉包的同時能實作對作業執行緒的開關控制。
uj5u.com熱心網友回復:
不要沉啊。。我找到一種方法就是在:
if (!aSocket.Accept(serverSocket))
改成try catch的結構,然后在界面執行緒需要關閉該執行緒時,產生一個執行緒中斷,從而退出,問題是
我在mfc里面好像沒有找到執行緒中斷的方法。。
uj5u.com熱心網友回復:
用異步socket,不要用阻塞socket。阻塞的socket只能自己給自己發個socket訊息,不然。。。
uj5u.com熱心網友回復:
斷開連接,讓 Socket 產生例外uj5u.com熱心網友回復:
你把1000改成無限等待不就可以了嘛轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/64498.html
標籤:網絡及通訊開發
上一篇:田忌賽馬 acm 動態規劃
下一篇:客戶端A/B,請求服務器D資料,需要經過C轉發,服務器回應通過C轉發給客戶端A/B。如何判斷服務器是回應哪個客戶端的請求的
