2013-03-17 116 views
0

這裏是Main.cpp的最多到錯誤發生的點:爲什麼我在這段代碼中遇到WSAENOTSOCK錯誤?

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd) 
{ 
    if(SUCCEEDED(CoInitialize(NULL))) 
    { 
     { 
      Game game; 

      game.CreateRessources(hInst); 

      game.ShowMainScreen(); 

      game.pWinsock->Initialize(game.Getm_hWnd()); 

game.Getm_hWnd返回私人HWND m_hWnd。

這裏是遊戲:: CreateRessources(HINSTANCE):

void Game::CreateRessources(HINSTANCE hInst) 
{ 
    m_hWnd=CreateWindowClass(hInst); 

    pMessageLog=CreateMessageLog(); 
    pD2DResources=CreateD2DResources(m_hWnd); 
    pWinsock=CreateWinsock(); 

} 

有CreateWinsock():

Winsock* CreateWinsock() 
{ 
    Winsock* pWinsock=new Winsock; 

    return pWinsock; 
} 

的Winsock :: Winsock的:

的Winsock :: Winsock的( ):Socket(NULL){}

最後,Winsock的初始化::(HWND):

void Winsock::Initialize(HWND hwnd) 
{ 
    WSADATA wsaDat; 

    SendMessage(hwnd, LOG_ADD, NULL, (LPARAM)L"Initializing winsock... "); 

    int nResult = WSAStartup(MAKEWORD(2,2),&wsaDat); 
    if(nResult!=0) 
    { 
     MessageBox(NULL,"Winsock initialization failed","Critical error",MB_ICONERROR); 
     SendMessage(hwnd,WM_DESTROY,NULL,NULL); 
    } 

    SendMessage(hwnd, LOG_ADD, NULL, (LPARAM)L"Done!\nCreating a socket... "); 

    Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    if(Socket==INVALID_SOCKET) 
    { 
     MessageBox(NULL,"Socket Creation failed","Critical error",MB_ICONERROR); 
     SendMessage(hwnd,WM_DESTROY,NULL,NULL); 
    } 

    SendMessage(hwnd, LOG_ADD, NULL, (LPARAM)L"Done!\nRequesting Windows message-based notification of network events... "); 

    nResult=WSAAsyncSelect(Socket,hwnd,WM_SOCKET,(FD_CLOSE|FD_READ)); 
    if(nResult) 
    { 
     if(WSAGetLastError()==WSAENOTSOCK) 
      MessageBox(hwnd,"WSAENOTSOCK Error!","Error",NULL); 
     MessageBox(NULL,"WSAAsyncSelect failed","Critical error",MB_ICONERROR); 
     SendMessage(hwnd,WM_DESTROY,NULL,NULL); 
    } 

    /* More code */ 
} 

如果(WSAGetLastError()== WSAENOTSOCK)返回true線。 WSAENOTSOCK意味着:。上nonsocket

「套接字操作嘗試 一個操作上的東西,不是一個套接字可能是套接字句柄參數沒有引用有效的套接字,或者選擇中,FD_SET中的成員無效。」

編輯:還有就是我的Winsock類:

class Winsock{ 
public: 
    Winsock(); 

    void Initialize(HWND); 

    void ReceiveMsg(); 

private: 
    SOCKET Socket; 
    static const char* server; 
    static const int port; 
}; 

據我所知,Socket是一個插座,和一個有效的。我怎麼會收到這個錯誤呢?

+0

'SendMessage'是你的一個函數嗎?在winsock API中找不到它,只有'send'。 – us2012 2013-03-17 18:36:58

+0

這是一個WinAPI函數。它發送一條消息給WinProc。 – 2013-03-17 18:38:36

+0

當你到達'WSAAsyncSelect'時,你確定沒有在'WndProc'中的某個地方關閉套接字嗎? – 2013-03-17 19:59:28

回答

2

您正在將Socket成員初始化爲Winsock構造函數中的錯誤值,而不是INVALID_SOCKET。它們不是同一個值。

無論socket()是成功還是失敗,您都在致電WSAAsyncSelect()。如果事情失敗,則顯示錯誤消息,但是如果失敗,則不會停止代碼。您需要清理錯誤處理。

在旁註中,您需要使用DestroyWindow()而不是手動發送WM_DESTROY消息。

試試這個:

class Winsock 
{ 
public: 
    Winsock(); 

    void Initialize(HWND); 

    void ReceiveMsg(); 

private: 
    SOCKET m_Socket; 
    ... 
}; 

Winsock::Winsock() 
    : m_Socket(INVALID_SOCKET) 
{ 
} 

void Winsock::Initialize(HWND hwnd) 
{ 
    SendMessage(hwnd, LOG_ADD, 0, (LPARAM)L"Initializing winsock... "); 

    WSADATA wsaDat = {0}; 
    if (WSAStartup(MAKEWORD(2,2), &wsaDat) != 0) 
    { 
     SendMessage(hwnd, LOG_ADD, 0, (LPARAM)L"Winsock initialization failed"); 
     return; 
    } 

    SendMessage(hwnd, LOG_ADD, 0, (LPARAM)L"Done!\nCreating a socket... "); 

    m_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (m_Socket == INVALID_SOCKET) 
    { 
     SendMessage(hwnd, LOG_ADD, 0, (LPARAM)L"Socket Creation failed"); 
     return; 
    } 

    SendMessage(hwnd, LOG_ADD, 0, (LPARAM)L"Done!\nRequesting Windows message-based notification of network events... "); 

    if (WSAAsyncSelect(m_Socket, hwnd, WM_SOCKET, FD_CLOSE|FD_READ) != 0) 
    { 
     SendMessage(hwnd, LOG_ADD, 0, (LPARAM)L"WSAAsyncSelect failed"); 
     return; 
    } 

    /* More code */ 
} 

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd) 
{ 
    if(SUCCEEDED(CoInitialize(NULL))) 
    { 
     Game game; 
     game.CreateResources(hInst); 
     game.ShowMainScreen(); 
     ... 
    } 
} 

void Game::CreateResources(HINSTANCE hInst) 
{ 
    m_hWnd = CreateWindowClass(hInst); 
    pMessageLog = CreateMessageLog(); 
    pD2DResources = CreateD2DResources(m_hWnd); 
    pWinsock = CreateWinsock(); 
    pWinsock->Initialize(m_hWnd); 
} 
+1

在初始化過程中,我沒有想到INVALID_SOCKET的事情!我必須去睡覺,但我會嘗試明天。 – 2013-03-18 01:51:31

相關問題