Message-Handling Sockets



  • geht das nicht auch nativ über if then else, oder passt das bei dir nicht rein .. ?

    if (send(client_sock, sendBuf, strlen(sendBuf) + 1 , 0) < 0)
      printf("failed\n");
    
     if (recv(client_sock, rcevBuf, sizeof(rcevBuf), 0) < 0)
      printf("failed\n");
    

    mfg



  • Original erstellt von hardcoreProgramierer:
    **geht das nicht auch nativ über if then else, oder passt das bei dir nicht rein .. ?

    if (send(client_sock, sendBuf, strlen(sendBuf) + 1 , 0) < 0)
      printf("failed\n");
    
     if (recv(client_sock, rcevBuf, sizeof(rcevBuf), 0) < 0)
      printf("failed\n");
    

    mfg**

    Ich glaube nicht, dass deine Methode eine Lösung ist, da er bestimmt nicht blockierende Sockets will.



  • Hi Leute,

    erstmal fettes mercy für eure Hilfe.

    //RockNix
    Meine WinProc sah genauso aus wie Dein Sample. Habe jetzt allerdings die Funktion RegisterWindowMessage() aus meinem "Server" rausgenommen und habe in meinen Sourcecode Dein define eingefügt. Ich bekomme allerdings immer noch keine Accept Message. Allerdings bekomme ich ein Read (dürfte ich die Read Message nicht erst nach dem Accept bekommen???). Ich denke es wird einfacher, wenn ich einfach den Source-Code poste. Vielleicht übersehe ich ja etwas. Ich habe mir nach der Ausführung des Codes mal über "netstat" die offenen Ports angesehen. Laut "netstat" habe ich eine hergestellte Verbindung zwischen dem Server und dem Client. Kann das den funktionieren ohne einem Acceptaufruf? Ich dachte nicht. Habe auch schon ein paar Tut's durchgeschaut. Doch die verwenden immer Konsolen in Verbindung mit Sockets, nie Dialoge.

    //hardcoreProgrammierer
    An welcher Stelle müssten denn die Funktionen eingefügt werden? Ich muß doch erst auf eine hergestellte Verbindung warten, bevor ich send aufrufe oder auf einen send warten, bevor ich recv aufrufe. Oder?

    //Serverpart
    SOCKET CChat_2Dlg::InitServer(unsigned short portnumber)
    {

    SOCKET s;
    struct sockaddr_in sa;
    HWND hwnd;
    int message = 0;
    memset(&sa, 0, sizeof(struct sockaddr_in));

    sa.sin_family = AF_INET; // Socket type
    sa.sin_port = htons(11777); // this is our port number /htons konvertiert die portnummer für tcp/ip
    sa.sin_addr.s_addr = inet_addr("127.0.0.1");
    s = socket(AF_INET, SOCK_STREAM, 0); // create the socket

    if (s == INVALID_SOCKET){
    m_state = "Konnte leider keinen Socket erstellen !!!";
    UpdateData(FALSE);
    return -1;
    }

    /* bind the socket to the internet address */
    if (bind(s, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
    closesocket(s);
    m_state = "Konnte Socket nicht an IP binden";
    UpdateData(FALSE);
    return -1;
    }

    hwnd = (HWND)this;
    // reg_message = RegisterWindowMessage("MESSAGE_SOCKET");
    message = WSAAsyncSelect(s, hwnd, WM_TCP_EVENT, FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE|FD_ACCEPT);
    message = WSAGetLastError();

    listen(s, 3);

    return s;
    }

    //WinProc
    LRESULT CChat_2Dlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {

    switch(message)
    {
    case WM_TCP_EVENT: AfxMessageBox("check accept");
    UINT wEvent = WSAGETSELECTEVENT(lParam);
    switch(wEvent)
    {
    case FD_CONNECT: AfxMessageBox("check connect");
    break;

    case FD_READ: AfxMessageBox("check read");
    break;

    case FD_WRITE: AfxMessageBox("check write");
    break;

    case FD_CLOSE: AfxMessageBox("check close");
    break;

    case FD_ACCEPT: AfxMessageBox("check accept");
    break;
    }
    break;
    }

    return CDialog::WindowProc(message, wParam, lParam);
    }

    //ClientPart
    void CChat_2Dlg::OnSend()
    {

    // char myname[256];

    struct sockaddr_in sa;
    //struct hostent *hp;
    int message = 0;

    memset(&sa, 0, sizeof(struct sockaddr_in)); // clear our address

    sa.sin_family = AF_INET; // Socket Type
    sa.sin_port = htons(11777); // this is our port number /htons konvertiert die portnummer für tcp/ip
    s_client = socket(AF_INET, SOCK_STREAM, 0); // create the socket
    sa.sin_addr.s_addr = inet_addr("127.0.0.1");
    if (s_client == INVALID_SOCKET){
    m_state = "Konnte leider keinen Socket erstellen !!!";
    UpdateData(FALSE);
    return;
    }

    if (connect(s_client, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
    message = WSAGetLastError();
    closesocket(s_client);
    m_state = "Konnte keinen Connect zum angegebenen Socket herstellen!!!";
    UpdateData(FALSE);
    }
    else{
    m_state = "Connect wurde hergestellt!!!";
    UpdateData(FALSE);
    }

    }



  • beim ersten überfliegen deines codes ( bitte code-tags verwenden 😉 ) ist mir ein fehler aufgefallen, der zur folge hat, das du kein accept-event bekommst !

    du musst WSAAsynchSelect() VOR bind() aufrufen, dann sollte es gehen ...

    hope it helps ... rocknix ///



  • Hi RockNix,

    trotz Änderung der Anordnung der Funktionen bekomme ich leider immer noch keine Message für ein Accept. Habe allerdings herausgefunden, dass die Funktion WSAAsyncSelect() mit einem Fehler zurückkommt. Laut Fehlercodeliste "10022 An invalid argument was supplied. WSAEINVAL". Socket passt. Der kann es nicht sein. Die Flags gehen auch in Ordnung. Bleiben nur noch das HWND und die Message.

    Gruß



  • .. ihr habt recht .. if(recv()) is blockiert und ist bestimmt nicht der
    richtige weg an msg's ranzukommen.. Vieleicht sollte man diese aufrufen wenn du deine msg bekommen hast, blos bin ich bei den prob nicht die richtige Hilfe.. sry

    mfg

    [ Dieser Beitrag wurde am 12.02.2003 um 09:15 Uhr von hardcoreProgramierer editiert. ]



  • Juhu,

    habe den dummen Fehler endlich gefunden. Lag alles nur an einem nicht korrektem HWND (*schäm*). Dadurch kam WSAAsyncSelect() mit einem errorcode zurück und ich hatte vergessen den Returnwert der Funktion zu überprüfen (*schon wieder schäm*). Ansonsten passt der Code. Fettes mercy nochmal an euch.

    Gruß maclittle



  • ok, die aufrufreihenfolge war auf jeden fall falsch, die message ist soweit in ordnung - dann wird der fehler vermutlich das window-handle sein. du gibst hier einen gecasteten this-pointer weiter. hmm, schwierig zu sagen, da ich die architektur deiner klasse nicht kenne. auf jeden fall solltest du hier noch einmal genauer schauen ... andererseits, da du die read-events bekommst, sehr fragwürdig ... wenn mir noch was einfällt ...

    good luck ... rocknix ///



  • hey, moment, du gibst als protokoll beim init des sockets eine 0 rüber ??? dann dürfte dein socket der übeltäter sein ... versuchs mal so:

    s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    

    so far ... rocknix ///



  • Hi RockNix,

    //hey, moment, du gibst als protokoll beim init des sockets eine 0 rüber

    ich habe in einem Tut gelesen, dass dieser Parameter nicht unbedingt benötigt wird. Und man auch eine Null übergeben kann. (Aber ich denke sauberer ist es schon so wie Du es sagst und schaden tuts ja auch nicht). Naja, seit dem das Problem mit dem HWND beseitigt war (*immer noch schande über mich*) "flutscht" es wie geschmiert. Also nochmal fettes mercy für Deine aussdauernde Hilfe.

    Gruß MacLittle


Anmelden zum Antworten