2014-04-18 42 views
0

我有簡單的TCP服務器,減少連接。我的TCP服務器被WSACancelBlockingCall殺死了?

UINT MTServerThread(LPVOID pParam) 
{  

    FILELog::ReportingLevel() = logINFO; 


    WSADATA wsaData; 
    sockaddr_in local; 
    int wsaret=WSAStartup(0x101,&wsaData); 
    if(wsaret!=0) 
    { 
     return 0; 
    } 
    local.sin_family=AF_INET; 
    local.sin_addr.s_addr=INADDR_ANY; 
    local.sin_port=htons((u_short)20248); 
    server=socket(AF_INET,SOCK_STREAM,0); 
    if(server==INVALID_SOCKET) 
    { 
     return 0; 
    } 
    if(bind(server,(sockaddr*)&local,sizeof(local))!=0) 
    { 
     return 0; 
    } 
    if(listen(server,10)!=0) 
    { 
     return 0; 
    } 

    SOCKET client; 
    sockaddr_in from; 
    int fromlen=sizeof(from); 

    while(true) 
    { 
     FILE_LOG(logINFO)<<"connecting"; 
     client=accept(server,(struct sockaddr*)&from,&fromlen); 
     if (client==INVALID_SOCKET) 
      { 
       int g = WSAGetLastError(); 

      FILE_LOG(logINFO)<<"invalid socket code "<<g; 
      } 
     AfxBeginThread(ClientThread,(LPVOID)client);  
    } 

    return 0; 
} 

我需要使用第三方編譯的DLL庫,也使自己的TCP通信不涉及到我的服務器和行爲像客戶端。在創建庫類對象並將其用於某些與其自己的(庫)TCP通信相關的過程之後,我的斷點在行int g = WSAGetLastError();上丟失。最後一個錯誤的結果是10004

這意味着:

WSAEINTR 
10004 
Interrupted function call. 
A blocking operation was interrupted by a call to WSACancelBlockingCall. 

是否有可能在DLL的代碼會影響我的TCP服務器?我有DLL源代碼,但我不能找到電話WSACancelBlockingCall在它。

如何開始解決這個問題?

回答

0

您正在使用Winsock的1.1和WSACancelBlockingCall()也適用於該版本的Winsock。但是由於在DLL源代碼中找不到WSACancelBlockingCall(),所以顯然它並未實際使用它。

嘗試更新您的應用程序使用Winsock的2.0+,而不是(只是你的第一個參數更改爲WSAStartup()),看看問題是否會消失。在Winsock 2.0中刪除WSACancelBlockingCall()

如果您仍然遇到的問題,那麼最有可能的罪魁禍首是你的機器上運行和干擾連接防火牆/防病毒程序。

順便說一下,如果accept()失敗,則不應該調用AfxBeginThread(),因爲沒有用於管理線程的連接。

+0

我用winsock 2.2版本進行了測試,但得到了相同的結果。我已經在兩臺機器上測試了這個項目,其中沒有安裝防病毒軟件。我不認爲這是防病毒問題,因爲如果我不創建dll類對象程序運行良好 – vico

+0

防火牆怎麼樣?你有排除嗎? –

+0

我已經測試過關閉防火牆 – vico

相關問題