0

エラーが発生するまでの Main.cpp は次のとおりです。

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 を返します。

Game::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() : ソケット(NULL) { }

最後に、Winsock::Initialize(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 */
}

行 if(WSAGetLastError()==WSAENOTSOCK) は true を返します。WSAENOTSOCK は次のことを意味します。

「非ソケットでのソケット操作。ソケットではないもので操作が試行されました。ソケット ハンドル パラメータが有効なソケットを参照していないか、選択のために fd_set のメンバーが無効でした。」

編集:私のWinsockクラスがあります:

class Winsock{
public:
    Winsock();

    void Initialize(HWND);

    void ReceiveMsg();

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

私が知る限り、ソケットはソケットであり、有効なものです。とにかくそのエラーを受け取るのはどうしてですか?

4

1 に答える 1

2

ではなく、コンストラクターSocketでメンバーを間違った値に初期化しています。それらは同じ値ではありません。WinsockNULLINVALID_SOCKET

成功しても失敗しWSAAsyncSelect()ても呼び出しています。socket()何かが失敗した場合にエラー メッセージを表示していますが、失敗したときにコードを停止していません。エラー処理をクリーンアップする必要があります。

ちなみに、メッセージを手動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);
}
于 2013-03-18T00:55:33.500 に答える