2012-04-14 47 views
4

所以這是我的情況。我正在與winsock合作,學習一些關於網絡和協議開發的事情,並且我陷入了僵局。我現在正在做一個服務器,在一個接受調用時阻塞,但在後臺有另一個線程等待用戶輸入和處理用戶輸入。這個用戶輸入用於send,ping和say等命令,但是現在我想要一個叫做exit的命令來關閉winsock,釋放所有打開的連接,然後結束程序。問題是,這個接受線程仍然阻塞。,我將如何停止從另一個線程阻塞的接受函數?

所以這裏的問題。 1)反正是有阻塞,而這就是所謂的停止Winsock的功能,和2)在非阻塞模式是這樣的:

while(m_continue) 
{ 
     Sleep(1); 
     tempsock = accept(m_listenSock, NULL, NULL); 
     if(tempsock != INVALID_SOCKET) 
     { 
      if(WSAGetLastError() == WSAEWOULDBLOCK) 
        continue; 
      else 
        return 1; 
     } 
     break; 
{ 

多餘或太inneficient使用?

回答

3

從用戶命令線程處理「退出」命令時,關閉m_listenSock套接字。阻止accept()呼叫將立即退出INVALID_SOCKET

請務必不要關閉m_listenSock處理兩次。

+0

哈,簡單。感謝一堆:P – FatalCatharsis 2012-04-14 06:51:20

+1

這不適用於我在Windows 7上。closesocket()和accept()調用線程都被阻塞。 – wilx 2012-11-20 10:53:49

+1

試試這個: 注意發出阻塞Winsock調用如accept時,Winsock可能需要等待網絡事件才能完成調用。在這種情況下,Winsock會執行一個可警告的等待,這可能會由同一個線程上安排的異步過程調用(APC)中斷。在APC內部發出另一個阻塞的Winsock調用,該調用在同一線程中中斷正在進行的阻塞Winsock調用將導致未定義的行爲,並且決不能由Winsock客戶端嘗試。 – 2015-08-24 09:39:32

相關問題