Poblema socket

sabato 18 novembre 2006 - 22.47

bitabit Profilo | Newbie

ho uno strano problema sulla comunicazione con un server per l'invio di un messaggio di posta - l'errore non genera alcuna eccezione e si manifesta con il blocco del programma (va in palla).

l'errore è di questo tipo:
connessione al server sulla porta 25 - ok
invio della prima stringa - ok
lettura della prima risposta del server - ok

invio della seconda stringa - ok
lettura della seconda risposta del server - errore - qui il programma si blocca e va in palla..

posso postare il codice o qualcuno sa gia dirmi di cosa si tratta?
grazie

Slayer Profilo | Newbie


Si posta almeno l' istruzionre che possa contenere l' errore.

bitabit Profilo | Newbie

si, ma prima devo fare due precisazioni relative ad alcune cose che ho scoperto stanotte:
1) in realtà l'unico momento in cui il server mi risponde è quando mi connetto ad esso:
myclient.connect(...) - > il server mi risponde e verifico la risposta (testato)

da qui in poi, le stringhe che invio non sono sicuro nemmeno che arrivino a destinazione, perche il server non risponde piu e in realtà ho scoperto che non va in palla il programma, ma semplicemente resta in attesa di risposta dal server e questa cosa l'ho scoperta con data avaible e cioè: if(dataavaible) se ci sono dati disponibili da leggere..fai qualcosa..e lui non fa niente..
sulla guida msdn ho letto che se non ci sono dati disponibili il progr resta in attesa!
questo è il codice modificato che mi ha portato a queste scoperte:

//inizio sessione socket
TcpClient myclient = new TcpClient();
string strtowrite = "";
string strtoread = "";
byte[] rispostaserver = new byte[100]; //la risposta del server non supererà mai i 100byte
byte[] scrivialserver;
ASCIIEncoding codifica = new ASCIIEncoding();
string verifica = ""; //per trovare le sottostringhe nelle risposte del server



myclient.Connect("193.70.192.50", 25);//connessione al client
NetworkStream streamonsocket = myclient.GetStream();//apertura dello stream sulla socket..ok qui il server mi risponde, ho omesso il codice che conferma quanto dico

//////////////////////////////////////////////////////
strtowrite = "helo libero.it";//stringa da inviare
scrivialserver = codifica.GetBytes(strtowrite);//stringa convertita in byte
streamonsocket.Write(scrivialserver, 0, scrivialserver.Length);//byteinviati


/*con la seguente istruzione dimostro
* che il server non risponde neanche su helo libero.it,
*/

if (streamonsocket.DataAvailable)//se ci sono risposte dal server...
{
label1.Text = "sto per leggere";
streamonsocket.Read(rispostaserver, 0, 100);//ora rispostaserver contiene la risposta in byte
strtoread = codifica.GetString(rispostaserver);//risposta server convertita in stringa
}

//fine spezzone di codice

bene, l'istruzione if (streamonsocket.DataAvailable) non è mai vera, ecco perche non riesco a leggere le risposte del server, perche non ce ne sono!
ma la domanda è: perche? le stringhe che invio col metodo write non arrivano a destinazione? devo simulare l'invio del tasto "invio"?
dove sbaglio?

bitabit Profilo | Newbie

ok, forse ci sono:
su una guida sul pop3 in questo sito (codice in vb.net) ho notato che ad ogni dinvio di una stringa opportunamente codifcata in ascii c'è sempre: stringadainviare + vbCrLf..
allotra ecco forse il mio problema: non ricevo risposte dal server semplicemente perchè..lui non riceve "del tutto" la mia richiesta...è come se io aprissi una sessione telnet, scrivessi cose tipo helo libero.it ma senza premere invio..è ovvio che lui ono mi risponde:
e allora ho bisogno di aiuto perchè non sapre come fare a simulare l'invio con c#...
qualcuno puo farmi un esempio di codice?

strtowrite = "helo libero.it";//stringa da inviare
scrivialserver = codifica.GetBytes(strtowrite);//stringa convertita in byte
streamonsocket.Write(scrivialserver, 0, scrivialserver.Length)

//dove lo piazzo il tasto invio? e come?
grazie

Slayer Profilo | Newbie

Del C# conosco poco, o quasi niente, pero posso dirti che vbCrLf è una costante carattere 'a capo', quindi in vb net è come se gli dassi l' invio. In C# non saprei vbCrLf come puo essere sostituito.

bitabit Profilo | Newbie

si serve per dare invio e in c# che io sappia si fa in 2 modi;
\n\r
enviromento.newline
in entrambi i casi non ho risolto il mio problema
aiuto..

bitabit Profilo | Newbie

trovato l'errore:
devo leggere con read() tutte le risposte, anche quelle che apparentemente non mi servono controllare
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5