Entra

View Full Version : [c/c++] 2 connesisoni socket


Fede_Reghe
18-03-2007, 16:46
Sto tentando di creare un piccolo programma dos che funga da chat. Apro il socket del server e del client, il server invia il messaggio di benvenuto e il client inizia a trasmettere quello che l'utente inserisce. Fin quando è un client tutto ok! il server riceve e stampa a video. Ora però devo connettere un altro client, si connette il server afferma che non ci sono errori ma quando digito qualcosa nel 2 client non arriva nulla al server. Vi lascio qua parte del codice sorgente del server:

while (1) {
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( socketparent, NULL, NULL );
}
printf( "Client Connected.\n");
socketparent = AcceptSocket; //Trasferisco il socket temporaneo a quello principale
break;
}
char sendbuf[100] = "\nBenvenuto\n";
char recvbuf[1000] = "";
bytesSent = send( socketparent, sendbuf, strlen(sendbuf), 0 ); //Invio il msg di benvenuto
while(true) {
while ((bytesRecv=recv( socketparent, recvbuf, 100, 0 ))==-1){}; //Attendo un messaggio
printf( "\nMsg: %s",&recvbuf); //Stampo il messaggio
}
Ovviamente il messaggio di benvenuto non appare perchè il while continua a girare, ma dovrebbe ricevere i messaggi!

sottovento
19-03-2007, 04:43
Ciao,
ci sono alcune osservazioni da fare sul codice. Purtroppo sono parziali poiche' non si sa come e' fatto il resto.

1 - Come hai strutturato il server? E' una applicazione multitask/multithread?
Se e' una applicazione a thread singolo, come gestisci il fatto che, in uscita dal loop infinito, non vengono gestite ulteriori connessioni?

2 - Analogamente al punto sopra: quante copie di socketparent hai in circolo?

3 - Quando spedisci la scritta di benvenuto non spedisci il relativo terminatore. Tutto fa pensare che la stessa tecnica sia usata anche nel client. In tal caso ti esponi ad un crash random. Quando ricevi qualcosa, per esempio, lo vai a stampare con la printf() e questo e' sufficiente a produrre crash o funzionamenti "strani";

4 - Ricorda che stai usando uno stream: potresti non ricevere tutti i dati in una volta sola, anche se la stringa e' corta!


Prova a chiarire questi passaggi e posta ancora

Sottovento

Fede_Reghe
19-03-2007, 15:37
Stavo pensando di farlo multithread ma non so come strutturarlo perchè se devo accettare molti client non posso creare 100 200 thread sarebbe una follia... Idem per il sockparent... Per terminatore della stringa cosa intendi?

nico88desmo
19-03-2007, 19:14
per gestire più connessioni client potresti usare il comando select.
prova a guardare in questo link:

http://www.lilik.it/~mirko/gapil/gapilse55.html#gapilsu251.html