Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    wxWindows: uso e sincronizzazione di socket

    Raga' sto impazzendo perche' non capisco dove sia l'errore!
    Sto creando un piccolo programmino per l'invio di email tramite SMTP.
    Lo sto creando con wxWindows, e quindi non uso le funzioni socket standard, bensi' quelle messe a disposizione da wxWindows.
    La comunicazione con un qualsiasi server SMTP avviene correttamente fino ad un certo punto, dopodiche' il server mi da' errore 421 e si disconnette.
    Facendo delle prove con telnet, ho visto che quell'errore lo da' se premo invio senza scrivere niente, ma in realta' cio' che invio con il metodo Write (che corrisponde a send) e' corretto, ho fatto dei controlli.
    Sara' un problema di sincronizzazione? c'e' un metodo WaitForRead che serve per attendere che dell'input sia disponibile nella socket, ma non funziona! il client va in attesa si', ma poi non "riparte" una volta ricevuto l'input dal server.
    Vi posto anche il codice, cosi' se vi va di dargli un'occhiata...
    Altrimenti vorrei sapere dove trovare un tutorial decente sulla sincronizzazione e sull'uso della wait che non faccia il solito esempietto del cavolo, ma che sia completo!
    Bye!

    void MyFrame::OnSend(wxCommandEvent& event)
    {
    wxIPV4address addr;
    addr.Hostname(wxT("mx2.mail.yahoo.com"));
    addr.Service(25);

    // Create the socket
    wxSocketClient* Socket = new wxSocketClient();

    // imposta il gestore eventi della socket
    Socket->SetEventHandler(*this, SOCKET_ID);
    Socket->SetNotify(wxSOCKET_CONNECTION_FLAG | wxSOCKET_INPUT_FLAG | wxSOCKET_LOST_FLAG | wxSOCKET_OUTPUT_FLAG);
    Socket->Notify(TRUE);

    // Wait for the connection event
    Socket->Connect(addr, FALSE);
    }


    void MyFrame::OnSocketEvent(wxSocketEvent& event)
    {
    // The socket that had the event
    wxSocketBase* sock = event.GetSocket();

    // Common buffer shared by the events
    char buf[100] = "";

    switch(event.GetSocketEvent())
    {
    // se ricevo un evento "connessione al server"
    case wxSOCKET_CONNECTION:
    {
    // scrive lo stato nella statusbar
    SetStatusText("Connected to SMTP server...");

    // appende lo stato nella textarea con il log dello stato
    statusInput->AppendText("\n\nConnected to SMTP server...");

    break;
    }

    // se ricevo un evento "input dal server"
    case wxSOCKET_INPUT:
    {
    char nextMessage[50] = "";

    static int count = 0;

    // legge l'input inviato dal server
    sock->Read(buf, sizeof(buf));

    // lo stampa nella textarea con il log dello stato
    statusInput->AppendText("\n");
    statusInput->AppendText(buf);

    const wxChar* temp;

    // decido qual e' il prossimo comando da inviare
    switch(count)
    {
    case 0:
    {
    // imposta e manda l'HELO
    strcpy(nextMessage, "HELO SMTP Client v1.0\n");

    sock->Write(nextMessage, sizeof(nextMessage));

    break;
    }

    case 1:
    {
    // imposta e manda MAIL FROM
    //leggendo l'indirizzo dal campo di input apposito
    temp = mailFromInput->GetValue();

    sprintf(nextMessage, "MAIL FROM:<%s>\n", temp);

    sock->Write(nextMessage, sizeof(nextMessage));

    break;
    }

    case 2:
    {
    // imposta e manda RCPT TO
    //leggendo l'indirizzo dal campo di input apposito
    temp = rcptToInput->GetValue();

    sprintf(nextMessage, "RCPT TO:<%s>\n", temp);

    sock->Write(nextMessage, sizeof(nextMessage));

    break;
    }

    case 3:
    {
    // imposta e manda DATA
    //leggendo il testo dell'email dalla textarea apposita
    temp = dataInput->GetValue();

    sprintf(nextMessage, "DATA\n%s\n.\n", temp);

    sock->Write(nextMessage, sizeof(nextMessage));

    break;
    }

    case 4:
    {
    // imposta e manda il comando QUIT
    strcpy(nextMessage, "QUIT\n");
    sock->Write(nextMessage, sizeof(nextMessage));

    break;
    }
    }

    statusInput->AppendText("\n");
    statusInput->AppendText(nextMessage);

    // incrementa la variabile statica count
    // in modo che al prossimo passo il comando da mandare al server
    // sara' quello seguente
    count++;

    break;
    }

    // se ricevo un evento "disconnessione dal server"
    case wxSOCKET_LOST:
    {
    sock->Destroy();

    // aggiorno la textarea con il log dello stato
    statusInput->AppendText("\nConnection lost.");
    SetStatusText("Connection lost...");

    // dialog con messaggio di errore
    wxString msg;
    msg.Printf(_T("Connection lost!"));
    wxMessageBox(msg, _T("Error"), wxOK | wxICON_ERROR);

    break;
    }

    // se ricevo un evento "output per il server"
    case wxSOCKET_OUTPUT:
    {
    break;
    }
    }
    }

  2. #2
    vabbe' mi rispondo da solo...
    mettendo qualche dialog con un messaggio qua e la, ho notato che non viene scatenato l'evento wxSOCKET_OUTPUT quando faccio una Write...
    Ma non capisco perche'!!!!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.