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;
}
}
}