2016-11-16 5 views
-4

私は、Win32 APIを使用してウィンドウを作り、それがメッセージループを入力する必要があります。Windowsメッセージループおよびサーバーループ

while (GetMessage(&msg, nullptr, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 

私のメインスレッドがある場合はどのように私は、ソケットサーバーを作成し、クライアントの受信を開始しますUIメッセージを処理していますか?

私はWinMain()からCreateThread()を使用してスレッド内のサーバーのすべてのコードを入れてみましたが、それは単にエラーでクラッシュ:ここ

Exception thrown at 0x00000000 in test.exe: 0xC0000005: Access violation executing location 0x00000000.

は、スレッドコードです:

DWORD WINAPI ThreadProc(LPVOID lpParameter) 
{ 
    // Initialize Winsock 
    WSADATA wsaData; 
    auto iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (iResult != 0) { 
     printf("WSAStartup failed with error: %d\n", iResult); 
     return EXIT_FAILURE; 
    } 

    addrinfo hints; 
    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_INET; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 
    hints.ai_flags = AI_PASSIVE; 

    // Resolve the server address and port 
    PADDRINFOA pAddrInfo = nullptr; 
    iResult = getaddrinfo(nullptr, PORT, &hints, &pAddrInfo); 
    if (iResult != 0) { 
     printf("getaddrinfo failed with error: %d\n", iResult); 
     WSACleanup(); 
     return EXIT_FAILURE; 
    } 

    while (true) { 
     // Create a SOCKET for connecting to server 
     auto ListenSocket = socket(pAddrInfo->ai_family, pAddrInfo->ai_socktype, pAddrInfo->ai_protocol); 
     if (ListenSocket == INVALID_SOCKET) { 
      printf("socket failed with error: %ld\n", WSAGetLastError()); 
      freeaddrinfo(pAddrInfo); 
      WSACleanup(); 
      return EXIT_FAILURE; 
     } 

     // Setup the TCP listening socket 
     iResult = bind(ListenSocket, pAddrInfo->ai_addr, static_cast<int>(pAddrInfo->ai_addrlen)); 
     if (iResult == SOCKET_ERROR) { 
      printf("bind failed with error: %d\n", WSAGetLastError()); 
      freeaddrinfo(pAddrInfo); 
      closesocket(ListenSocket); 
      WSACleanup(); 
      return EXIT_FAILURE; 
     } 

     freeaddrinfo(pAddrInfo); 

     iResult = listen(ListenSocket, SOMAXCONN); 
     if (iResult == SOCKET_ERROR) { 
      printf("listen failed with error: %d\n", WSAGetLastError()); 
      closesocket(ListenSocket); 
      WSACleanup(); 
      return EXIT_FAILURE; 
     } 

     // Accept a client socket 
     auto ClientSocket = accept(ListenSocket, nullptr, nullptr); 
     if (ClientSocket == INVALID_SOCKET) { 
      printf("accept failed with error: %d\n", WSAGetLastError()); 
      closesocket(ListenSocket); 
      WSACleanup(); 
      return EXIT_FAILURE; 
     } 

     // No longer need server socket 
     closesocket(ListenSocket); 

     // Receive until the peer shuts down the connection 
     for (;;) 
     { 
      char recvbuf[1] = { 0 }; 
      auto cbLen = recv(ClientSocket, recvbuf, sizeof(recvbuf), 0); 

      if (cbLen > 0) { 
       if (recvbuf[0] == 0xDA) 
       { 
        Hide(); 
       } 

       continue; 
      } 
      else if (cbLen == 0) { 
       printf("Connection closing...\n"); 
       break; 
      } 
      else { 
       printf("recv failed with error: %d\n", WSAGetLastError()); 
       closesocket(ClientSocket); 
       WSACleanup(); 
       return EXIT_FAILURE; 
      } 
     } 

     // shutdown receive operations since we're done 
     iResult = shutdown(ClientSocket, SD_RECEIVE); 
     if (iResult == SOCKET_ERROR) { 
      printf("shutdown failed with error: %d\n", WSAGetLastError()); 
      closesocket(ClientSocket); 
      WSACleanup(); 
      return EXIT_FAILURE; 
     } 

     // cleanup 
     closesocket(ClientSocket); 
    } 
    WSACleanup(); 

    return 0; 
} 
+1

残りのコードは何ですか(私はThreadProcとCreateThreadが見えません)?例外はどこで手に入りますか? – z32a7ul

+0

0x00000000にスローされた例外があります - あなたのThreadProcはNULLですか? CreateThreadを呼び出すと、新しいスレッドの開始アドレスを示すパラメータの正確な値は何ですか? – z32a7ul

+0

コードに欠陥がありますが、関連するコードが表示されませんでした –

答えて

0

これがされ非常に混乱しやすい質問ですが、タイトルでは1つの質問がありますが、内容が異なる問題(スレッドがクラッシュ)に対処しています。

主な質問に対処するには:マイクロソフトでは、ソケット通信をGUIスレッドのフレンドリな方法で処理する方法を追加しました:WSAAsyncSelect。これにより、ソケットイベントがメッセージとしてアプリケーションメッセージキューに送信されます。通常、メッセージを処理するために不可視ウィンドウが作成されます。

+0

質問者があなたにこの回答を書くよう依頼したかもしれませんが、質問された質問に答えません。 –

+0

ポストの最初の実際の行は、文字通り:「私のメインスレッドがUIメッセージを処理している場合、ソケットサーバーを作成してクライアントを受け取る方法は?」それは、間違いなく、スレッドに関する多くの騒ぎが続いています。 –

関連する問題