WinAPI Chat



  • Hi erstmal!

    Ich hab mich in letzter Zeit mit WinAPI und Winsock ein bisschen auseinandergesetzt und wollte dann ein kleines Chat-Tool schreiben. Ich verstehe das Grundgerüst der WinAPI und kann auch damit arbeiten. Ich habe auch schon früher in der Konsole eine Art Chat programmiert. Ich habe jetzt versucht das zusammenzubekommen, nur das ist mir noch nicht so ganz gelungen. Ich habe schon eine Verbindung hergestellt. Aber so ganz sicher kann ich es noch nicht und der Datenaustausch will auch noch nicht funktionieren.
    Kann mir jemand weiterhelfen? Ich habe auch lange nach Tutorials gesucht - vergeblich.
    Bitte um schnelle Antwort! Danke,
    Flo



  • Ohne genaue Beschreibung deines Problems und ein bisschen was von deinem Code können wir dir nicht sagen, wo dein Fehler ist ;).

    cya 🙂



  • Bitte nicht aufregen, wegen unsauberer Schreibweise oder so...Bin halt noch ziemlich neu:

    #include <windows.h>
    #define WM_WINSOCK 1099
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    int InitWinsock(HWND hwnd);
    
    SOCKET sock;
    SOCKADDR_IN address;
    
    int WINAPI WinMain(HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) {
       WNDCLASS wc;
       MSG msg;
       HWND hwnd;
       char szName[]="Fensterklasse";
    
       wc.cbClsExtra=0;
       wc.cbWndExtra=0;
       wc.hbrBackground=(HBRUSH) GetStockObject(BLACK_BRUSH);
       wc.hCursor=LoadCursor(NULL, IDC_ARROW);
       wc.hIcon=LoadIcon(NULL, IDI_ERROR);
       wc.hInstance=hI;
       wc.lpfnWndProc=WndProc;
       wc.lpszClassName=szName;
       wc.lpszMenuName=NULL;
       wc.style=CS_HREDRAW | CS_VREDRAW;
    
       RegisterClass(&wc);
    
       hwnd=CreateWindow(szName, "Server", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
          280, 200, NULL, NULL, NULL, NULL);
    
       ShowWindow(hwnd, iCmdShow);
       UpdateWindow(hwnd);
    
       while(GetMessage(&msg, NULL, NULL, NULL)) {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
       }
    
       return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
       HWND button1;
       HWND edit1;
       int status=0;
       char buf[500];
    
       switch(message) {
       case WM_CREATE:
          button1=CreateWindow("button", "Listen", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 110, 20, 
             60, 20, hwnd, (HMENU) 1, NULL, NULL);
          edit1=CreateWindow("edit", "", WS_CHILD | WS_VISIBLE, 100, 50,
             100, 50, hwnd, (HMENU) 2, NULL, NULL);
          return 0;
       case WM_COMMAND:
          if(LOWORD(wParam)==1) {
             status=InitWinsock(hwnd);
             if(status==1) {
                MessageBox(hwnd, "Socket-Fehler!", "Fehler", NULL);
             } else {
                MessageBox(hwnd, "Winsock gestartet!", "Winsock", NULL);
             }
    
          }
          return 0;
       case WM_DESTROY:
          PostQuitMessage(0);
          return 0;
    
       case WM_WINSOCK:
          if(lParam==FD_ACCEPT) {
             wParam=accept(wParam, NULL, NULL);
             if(wParam==INVALID_SOCKET) {
                MessageBox(hwnd, "...verursachte einen Fehler!", "Accept", NULL);
             } else {
                MessageBox(hwnd, "...ok!", "Accept", NULL);
             }
          } else if(lParam==FD_READ) {
             status=recv(sock, buf, 5, NULL);
             buf[status]='\0';
                MessageBox(hwnd, "Nachrichten angekommen!", buf, NULL);
             SetDlgItemText(hwnd, 2, buf);
          }
       }
    
       return DefWindowProc(hwnd, message, wParam, lParam);
    }
    
    int InitWinsock(HWND hwnd) {
       long status;
       int finalstatus=0;
    
       WSADATA wsa;
       status=WSAStartup(MAKEWORD(2,0), &wsa);
    
       if(status==-1) {
          finalstatus=1;
       }
    
       sock=socket(AF_INET, SOCK_STREAM, NULL);
    
       if(sock==INVALID_SOCKET) {
          finalstatus=1;
       }
    
       memset(&address,0,sizeof(SOCKADDR_IN));
       address.sin_family=AF_INET;
       address.sin_port=htons(11189);
    
       status=bind(sock, (SOCKADDR*)&address, sizeof(SOCKADDR));
    
       if(status==SOCKET_ERROR) {
          finalstatus=1;
       }
    
       WSAAsyncSelect(sock, hwnd, WM_WINSOCK, FD_ACCEPT | FD_READ | FD_WRITE);
    
       status=listen(sock, 1);
    
       if(status==SOCKET_ERROR) {
          finalstatus=1;
       }
    
       if(status==SOCKET_ERROR) {
          finalstatus=1;
       }
       return finalstatus;
    }
    

    Sind jetzt noch keine Komentare dabei, ich hoffe ihr könnt es auch so verstehen...

    Codetags.

    [ Dieser Beitrag wurde am 03.02.2003 um 18:59 Uhr von cd9000 editiert. ]



  • Aber die Code-Tags hättest du schon hinkriegen können...

    cya 🙂



  • Was? Sorry, für alles, was ich falsch mache *g*! Aber kannnun jemand helfen oder nich?



  • Naja, Code-Tags... wenn du einen Beitrag schreibst, dann steht da unter dem großen EDIT-Feld was von "C++ Code", da klickst du drauf, und schon hast du deine Code-Tags. Dazwischen dann einfach den Code reinschreiben, dann wird der wunderschön formatiert, und man kann ihn viel besser lesen. Ich hab das für dich jetzt mal gemacht:

    #include <windows.h>
    #define WM_WINSOCK 1099
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    int InitWinsock(HWND hwnd);
    
    SOCKET sock;
    SOCKADDR_IN address;
    
    int WINAPI WinMain(HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) {
    WNDCLASS wc;
    MSG msg;
    HWND hwnd;
    char szName[]="Fensterklasse";
    
    wc.cbClsExtra=0;
    wc.cbWndExtra=0;
    wc.hbrBackground=(HBRUSH) GetStockObject(BLACK_BRUSH);
    wc.hCursor=LoadCursor(NULL, IDC_ARROW);
    wc.hIcon=LoadIcon(NULL, IDI_ERROR);
    wc.hInstance=hI;
    wc.lpfnWndProc=WndProc;
    wc.lpszClassName=szName;
    wc.lpszMenuName=NULL;
    wc.style=CS_HREDRAW | CS_VREDRAW;
    
    RegisterClass(&wc);
    
    hwnd=CreateWindow(szName, "Server", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
    280, 200, NULL, NULL, NULL, NULL);
    
    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);
    
    while(GetMessage(&msg, NULL, NULL, NULL)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    
    return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
    HWND button1;
    HWND edit1;
    int status=0;
    char buf[500];
    
    switch(message) {
    case WM_CREATE:
    button1=CreateWindow("button", "Listen", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 110, 20, 
    60, 20, hwnd, (HMENU) 1, NULL, NULL);
    edit1=CreateWindow("edit", "", WS_CHILD | WS_VISIBLE, 100, 50,
    100, 50, hwnd, (HMENU) 2, NULL, NULL);
    return 0;
    case WM_COMMAND:
    if(LOWORD(wParam)==1) {
    status=InitWinsock(hwnd);
    if(status==1) {
    MessageBox(hwnd, "Socket-Fehler!", "Fehler", NULL);
    } else {
    MessageBox(hwnd, "Winsock gestartet!", "Winsock", NULL);
    }
    
    }
    return 0;
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    
    case WM_WINSOCK:
    if(lParam==FD_ACCEPT) {
    wParam=accept(wParam, NULL, NULL);
    if(wParam==INVALID_SOCKET) {
    MessageBox(hwnd, "...verursachte einen Fehler!", "Accept", NULL);
    } else {
    MessageBox(hwnd, "...ok!", "Accept", NULL);
    }
    } else if(lParam==FD_READ) {
    status=recv(sock, buf, 5, NULL);
    buf[status]='\0';
    MessageBox(hwnd, "Nachrichten angekommen!", buf, NULL);
    SetDlgItemText(hwnd, 2, buf);
    }
    }
    
    return DefWindowProc(hwnd, message, wParam, lParam);
    }
    
    int InitWinsock(HWND hwnd) {
    long status;
    int finalstatus=0;
    
    WSADATA wsa;
    status=WSAStartup(MAKEWORD(2,0), &wsa);
    
    if(status==-1) {
    finalstatus=1;
    }
    
    sock=socket(AF_INET, SOCK_STREAM, NULL);
    
    if(sock==INVALID_SOCKET) {
    finalstatus=1;
    }
    
    memset(&address,0,sizeof(SOCKADDR_IN));
    address.sin_family=AF_INET;
    address.sin_port=htons(11189);
    
    status=bind(sock, (SOCKADDR*)&address, sizeof(SOCKADDR));
    
    if(status==SOCKET_ERROR) {
    finalstatus=1;
    }
    
    WSAAsyncSelect(sock, hwnd, WM_WINSOCK, FD_ACCEPT | FD_READ | FD_WRITE);
    
    status=listen(sock, 1);
    
    if(status==SOCKET_ERROR) {
    finalstatus=1;
    }
    
    if(status==SOCKET_ERROR) {
    finalstatus=1;
    }
    return finalstatus;
    }
    

    cya 🙂

    [ Dieser Beitrag wurde am 03.02.2003 um 17:38 Uhr von MagiC Creator editiert. ]



  • Oh, danke, jetzt weiß ich, was du meinst 🙂
    Hat jetzt jemand ne Ahnung wie mir zu helfen ist? *g*



  • So, ich habe jetzt nochmal eine Version ausgearbeitet, die nur bis zu dme Listen-Modus reicht. Kann mir jemand vielleciht helfen, wie ich jetzt weitermachen soll? Um eine Verbindung anzunehmen...?

    #include <windows.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    int InitWinsock(void);
    int WinsockListen(void);
    
    SOCKET sock;
    SOCKADDR_IN address;
    
    int WINAPI WinMain(HINSTANCE hI, HINSTANCE hPrI, PSTR szCmdLine, int iCmdShow) {
        WNDCLASS wc;
        MSG msg;
        HWND hwnd;
        char szName[]="Fensterklasse";
    
        wc.cbClsExtra=0;
        wc.cbWndExtra=0;
        wc.hbrBackground=(HBRUSH) GetStockObject(BLACK_BRUSH);
        wc.hCursor=LoadCursor(NULL, IDC_ARROW);
        wc.hIcon=LoadIcon(NULL, IDI_ERROR);
        wc.hInstance=hI;
        wc.lpfnWndProc=WndProc;
        wc.lpszClassName=szName;
        wc.lpszMenuName=NULL;
        wc.style=CS_HREDRAW | CS_VREDRAW;
    
        RegisterClass(&wc);
    
        hwnd=CreateWindow(szName, "Server", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
            280, 200, NULL, NULL, NULL, NULL);
    
        ShowWindow(hwnd, iCmdShow);
        UpdateWindow(hwnd);
    
        InitWinsock();
    
        while(GetMessage(&msg, NULL, NULL, NULL)) {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    
        return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
        HWND button1;
        HWND edit1;
        int status=0;
    
        switch(message) {
        case WM_CREATE:
            button1=CreateWindow("button", "Listen", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 20, 
                60, 20, hwnd, (HMENU) 1, NULL, NULL);
            edit1=CreateWindow("edit", "", WS_CHILD | WS_VISIBLE, 10, 50,
                200, 50, hwnd, (HMENU) 2, NULL, NULL);
            return 0;
        case WM_COMMAND:
            if(LOWORD(wParam)==1) {
                status=WinsockListen();
                if(status==1) {
                    MessageBox(hwnd, "Listen-Fehler!", "Winsock", NULL);
                } else {
                    MessageBox(hwnd, "Im Listen-Modus...", "Winsock", NULL);
                }
            }
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    
    int InitWinsock(void) {
        long status;
        int finalstatus=0;
    
        WSADATA wsa;
        status=WSAStartup(MAKEWORD(2,0), &wsa);
    
        if(status==-1) {
            finalstatus=1;
        }
    
        sock=socket(AF_INET, SOCK_STREAM, NULL);
    
        if(sock==INVALID_SOCKET) {
            finalstatus=1;
        }
    
        memset(&address,0,sizeof(SOCKADDR_IN));
        address.sin_family=AF_INET;
        address.sin_port=htons(11189);
    
        status=bind(sock, (SOCKADDR*)&address, sizeof(SOCKADDR));
    
        if(status==SOCKET_ERROR) {
            finalstatus=1;
        }
    
        return finalstatus;
    } 
    
    int WinsockListen(void) {
        long status;
        int finalstatus;
    
        status=listen(sock, 1);
    
        if(status==SOCKET_ERROR) {
            finalstatus=1;
        }
        return finalstatus;
    }
    


  • Weiß niemand, was ich machen kann? Bitte, ich hab mich schon tagelang rumgegoogled aber ncihts gefunden...das hier ist wohl oder übel meine letzte Hoffnung. Bitte antwortet mal was "konstruktives"!!! 😕 😞



  • So, hab mich jetzt mal angemeldet. Wenn keiner mir helfen kann, kann er bitte trotzdem mal was sagen? Mir kommt es so vor, als würde mein beitrag überlesen werden. Vielleicht kann jemand auch einfach nen link nennen wo ich was dazu finden kann. Wäre echt nett!!



  • Original erstellt von FlorianLabu:
    So, hab mich jetzt mal angemeldet. Wenn keiner mir helfen kann, kann er bitte trotzdem mal was sagen? Mir kommt es so vor, als würde mein beitrag überlesen werden. Vielleicht kann jemand auch einfach nen link nennen wo ich was dazu finden kann. Wäre echt nett!!

    Du hast Post, vielleicht kann ich Dir mit dem Chat helfen

    Gruß
    Robby


Anmelden zum Antworten