2013-03-02 63 views
1

我想使用WINAPI創建兩個窗口,然後我想使用TCP套接字在它們之間進行通信。 到目前爲止,我已經成功創建了兩個窗口,併成功打開了套接字。但兩個窗口如何使用此套接字進行通信?這裏是我寫到目前爲止的代碼:使用TCP套接字(WIN32 API)創建的兩個窗口之間的通信

另一個問題是,代碼只發送一次數據從服務器到客戶端。其他窗口消息不處理,除非數據從服務器發送到客戶端一次:( 某人幫助我請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; 


} 
+0

除了send()和recv()函數,您似乎已經發現* WinSOCK * API的每個部分。 – EJP 2013-03-02 05:57:25

+0

在連接的套接字上接收到數據時是否生成任何Windows消息? (如創建窗口時生成WM_CREATE消息)。如果每次在連接的套接字上接收到數據時都會生成這樣的消息,我的任務將變得更加容易。 – Ayse 2013-03-02 05:59:06

+0

對不起,要求提出一個愚蠢的問題:( 我是Windows編程新手 – Ayse 2013-03-02 06:01:41

回答

1

嘗試使用WSAAsyncSelect建立了基於消息的連接,這樣你可以繼續在程序運行時,發送/接收郵件

http://msdn.microsoft.com/en-us/library/windows/desktop/ms741540%28v=vs.85%29.aspx

也有使用WIN32 API +的Winsock在codeproject.com的優秀教程:

在WSAAsyncSelect函數這裏更多信息http://www.codeproject.com/Articles/13071/Programming-Windows-TCP-Sockets-in-C-for-the-Begin

如果按照教程,包括註冊窗口消息,你應該能夠多次從服務器發送數據到客戶端,反之亦然,直到套接字關閉。

我希望有幫助。

Mmarss

+0

非常感謝你。這個教程真的幫了我很多:) – Ayse 2013-03-05 05:50:48