2

WINAPIを使用して2つのウィンドウを作成し、次にTCPスコケットを使用してそれらの間で通信したいと思います。これまでのところ、2つのウィンドウを正常に作成し、ソケットも正常に開いています。しかし、2つのウィンドウがこのソケットを使用してどのように通信するのでしょうか。これが私がこれまでに書いたコードです:

もう1つの問題は、コードがサーバーからクライアントに1回だけデータを送信することです。また、データがサーバーからクライアントに1回送信されない限り、他のWindowsメッセージは処理されません:(誰か助けてください?サーバーウィンドウenter code here

// Program Name: server_window
// ===============================
// Author Name: Ayesha Hassan
// ===============================
// The Program creates a Listening Socket and waits for the client.
// As soon as a Client is connected to this Server's Listening Socket, a Window is launched.      
// When the user Clicks on this window using Mouse, a Message is sent to the Client over the Connected Socket. 

#include <windows.h>
#include <iostream.h>
#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <tchar.h>
#include "resource.h"
#pragma comment(lib,"ws2_32.lib")

SOCKET AH_GlbSocket;

const char AH_GlbClassName[] = "myWindClass";   ///Window Class Name
HWND AH_Glb_hwnd;   //Header to Window

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, 
            WPARAM wParam, LPARAM lParam)
{
char message[]="Mouse Clicked On SERVER Window";
HDC hdc;

//Gets Handle for the Window 
hdc=GetDC(hwnd);

char buffer[1000];
memset(buffer,0,999);

   switch(msg)
      {

      case WM_LBUTTONDOWN:
      //Sends Text to be displayed oon Client Window
         send(AH_GlbSocket, message, strlen(message), 0);
         break;

      case WM_CREATE:
          {
             WSADATA WsaDat;
             if(WSAStartup(MAKEWORD(2,2), &WsaDat)!=0)
                {
                   //printf("WSA Initialization failed!\r\n");
                   WSACleanup();
                   system("PAUSE");
                   return 0;
                }

                AH_GlbSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
                if(AH_GlbSocket == INVALID_SOCKET)
                   {
                      //printf("AH_GlbSocket creation failed.\r\n");
                      WSACleanup();
                      system("PAUSE");
                      return 0;
                   }
                //else
                   //printf("Socket created.\n");

                SOCKADDR_IN serverInf;
                serverInf.sin_family = AF_INET;
                serverInf.sin_addr.s_addr = INADDR_ANY;
                serverInf.sin_port = htons(8888);

                if(bind(AH_GlbSocket,(SOCKADDR*)(&serverInf), sizeof(serverInf)) == SOCKET_ERROR)
                   {
                      //printf("Unable to bind AH_GlbSocket!\r\n");
                      WSACleanup();
                      system("PAUSE");
                      return 0;
                   }

                listen(AH_GlbSocket, 1);
                SOCKET TempSock = SOCKET_ERROR;

                while(TempSock == SOCKET_ERROR)
                {
                   //printf("Waiting for incoming connections...\n\n");
                  TempSock = accept(AH_GlbSocket, NULL, NULL);
                }
                AH_GlbSocket = TempSock;


         }
         break;
      case WM_CLOSE:
         DestroyWindow(hwnd);
         break;

      case WM_DESTROY:
         PostQuitMessage(0);
         break;

      default:
         return DefWindowProc(hwnd, msg, wParam, lParam);
      }
    return 0;
}

int WINAPI WinMain(  HINSTANCE hInstance, 
  HINSTANCE hPrevInstance, 
  LPSTR lpCmdLine, 
  int nShowCmd )
{


   WNDCLASSEX wc;
   MSG Msg;

   //Step 1: Registering the Window Class
   wc.cbSize        = sizeof(WNDCLASSEX);
   wc.style         = 0;
   wc.lpfnWndProc   = WndProc;
   wc.cbClsExtra    = 0;
   wc.cbWndExtra    = 0;
   wc.hInstance     = NULL;
   wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
   wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
   wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
   wc.lpszMenuName  = NULL;
   wc.lpszClassName = AH_GlbClassName;
   wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);  
   //wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MYMENU);
   //wc.hIcon  = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
   //wc.hIconSm  = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 26, 26, 0);

   if(!RegisterClassEx(&wc))
   {
      MessageBox(NULL, "Window Registration Failed!", "Error!",
                  MB_ICONEXCLAMATION | MB_OK);
      return 0;
   }

   // Step 2: Creating Window1
   AH_Glb_hwnd = CreateWindowEx( WS_EX_CLIENTEDGE,
                                 AH_GlbClassName,
                                 "I am SERVER Window",
                                 WS_OVERLAPPEDWINDOW,
                                10,30, 540, 220,
                                 NULL, NULL, NULL, NULL);
   if(AH_Glb_hwnd == NULL)
   {
      MessageBox(NULL, "Window Creation Failed!", "Error!",
                 MB_ICONEXCLAMATION | MB_OK);
      return 0;
   }

   ShowWindow(AH_Glb_hwnd,SW_SHOWDEFAULT);
   UpdateWindow(AH_Glb_hwnd);

   // Step 3: The Message Loop
   while(GetMessage(&Msg, NULL, 0, 0) > 0)
   {
      TranslateMessage(&Msg);
      DispatchMessage(&Msg);
   }
   return Msg.wParam; 


}


***CLIENT WINDOW:***
#include <windows.h>
#include "stdafx.h"
//#include <iostream.h>
#include <winsock2.h>
#include <stdio.h>
#include "resource.h"
#pragma comment(lib,"ws2_32.lib")

SOCKET AH_Glb_Socket;

const char AH_Glb_ClassName[] = "myWindClass";
HWND AH_Glb_hwnd;


// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{


    switch(msg)
    {

        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);

    }
    return 0;
}



int WINAPI WinMain(  HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
    // Initialise Winsock
    WSADATA WsaDat;  

    if(WSAStartup(MAKEWORD(2,2),&WsaDat)!=0)
    {
        printf("Winsock error - Winsock initialization failed");
        WSACleanup();
        system("PAUSE");
        return 0;
    }
    char* buff="CLIENT says: I am Going to connect to the server now\n\n";
    printf(buff,sizeof(buff));
    // Create our socket
    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(Socket==INVALID_SOCKET)
    {
        printf("Winsock error - Socket creation Failed!\r\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    // Resolve IP address for hostname
    struct hostent *host;
    if((host=gethostbyname("localhost"))==NULL)
    {
        printf("Failed to resolve hostname.\r\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    // Setup our socket address structure
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port=htons(8888);
    SockAddr.sin_family=AF_INET;
    SockAddr.sin_addr.s_addr=*((unsigned long*)host->h_addr);

    // Attempt to connect to server
    if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr))!=0)
    {
        printf("Failed to establish connection with server\r\n");
        WSACleanup();
        //system("PAUSE");
        //return 0;
    }

    WNDCLASSEX wc;

    MSG Msg;

    //Step 1: Registering the Window Class
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = NULL;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = AH_Glb_ClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    //wc.lpszMenuName  = MAKEINTRESOURCE(IDR_MYMENU);
    //wc.hIcon  = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON));
    //wc.hIconSm  = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON), IMAGE_ICON, 26, 26, 0);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    // Step 2: Creating Window1
    AH_Glb_hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        AH_Glb_ClassName,
        "I am CLIENT Window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 440, 120,
        NULL, NULL, NULL, NULL);

    if(AH_Glb_hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(AH_Glb_hwnd,SW_SHOWDEFAULT);
    UpdateWindow(AH_Glb_hwnd);

    char buffer[1000];
    memset(buffer,0,999);

        recv(Socket,buffer,1000,0);
        printf(buffer,sizeof(buffer));
        TextOut(GetDC(AH_Glb_hwnd),5,5,buffer,sizeof(buffer));


    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {   
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;


}
4

1 に答える 1

2

WSAAsyncSelectを使用して、メッセージベースの接続を確立してみてください。そうすれば、プログラムの実行中にメッセージの送受信を続けることができます。

WSAAsyncSelect関数の詳細については、http://msdn.microsoft.com/en-us/library/windows/desktop/ms741540%28v=vs.85%29.aspxを 参照してください。

codeproject.comには、WIN32 API + winsockの使用に関する優れたチュートリアルもあります:http://www.codeproject.com/Articles/13071/Programming-Windows-TCP-Sockets-in-C-for-the-Begin

ウィンドウメッセージの登録を含むチュートリアルに従うと、ソケットが閉じられるまで、サーバーからクライアントに、またはその逆にデータを複数回送信できるはずです。

それがお役に立てば幸いです。

Mmarss

于 2013-03-02T06:36:44.890 に答える