Newsgroup: it.comp.programmare.win32
Titolo: Aiuto Winsock e C++

Salve a tutti,
il mio problema è il seguente: sto cercando di creare un server in C++, ma
non so da che parte voltarmi per permettere a più client di collegarsi
contemporaneamente al mio server. Il codice "base" del server è il seguente
(è copiato da un tutorial che ho trovato online); ho tolto i vari controlli
sugli errori solo per permetterne una migliore leggibilità nella mail...
In Java per fare lo stesso lavoro uso i thread, ma non so se è possibile
fare lo stesso in C++ (ah, io uso DEV C++ ).
Grazie mille in anticipo per l'aiuto.
Ursula
    int main(void)   {
        SOCKET sock21,asock;
        sockaddr_in sock_in21,asock_in;
        WORD wVersionRequested;
        WSADATA wsaData;
        int err,backlog=1,addrlen;
        char send_buf[]="**SERVER TELNET DI PROVA**\n\n*****RECEIVE
ONLY*****";
        char recv_buff=' ';
        wVersionRequested = MAKEWORD(2,0);
        sock21=socket(PF_INET,SOCK_STREAM,0);
        sock_in21.sin_family=PF_INET;
        sock_in21.sin_port = htons(IPPORT_TELNET);
        sock_in21.sin_addr.s_addr = INADDR_ANY;
        err=bind(sock21,(struct sockaddr*)&sock_in21,sizeof(struct
sockaddr_in));
        err=listen(sock21,backlog);
        addrlen=sizeof(struct sockaddr);
        asock=accept(sock21,(struct sockaddr*)&asock_in,(LPINT)&addrlen);
        err=send(asock,&send_buf[0],strlen(send_buf),0);
        printf("recv() - Aspetto dati dal client\n");
        while(recv_buff!=KEY_ESC) {
              err=recv(asock,&recv_buff,1,0);
              if(recv_buff!=KEY_ESC) {
                   printf("%c",recv_buff);
                   send(asock,&recv_buff,1,0);
              }
        }
        shutdown(asock,2);
        err=closesocket(asock);
        shutdown(sock21,2);
        err=closesocket(sock21);
        return 0;
   }

        ----------------------------------------------------
tutto il codice limitato va nel thread di "servizio".
io utilizzo proprio questo metodo per i miei programmi:
guarda sul mio sito relay6 e/o ididv6...
c'e' da dire che per server con grossi carichi (leggi: molti client da servire)
non e' per niente un buon metodo, mentre va benissimo per un limitato numero di
client.
Francesco Picasso
http://francesco.netsigners.com

 
[...]
Se il tuo programma deve funzionare solo in windows puoi utilizzare 
anche in questo caso i thread (creati con l'API CreateThread).
Tieni però presente che dovrai gestire direttamente (con 
mutex,eventi,critical_section etc...) la sincronizzazione tra i vari 
thread (che in java può essere gestita in modo più semplice dichiarando 
le funzioni "sincronizzate", se la mia memoria non si è arrugginita).
Se invece vuoi scrivere del codice portabile dovresti utilizzare la 
funzione select ed effettuare un "polling" sugli eventi dei vari socket 
(uno che accetta le chiamate entranti e uno per ogni client connesso) 
oppure lanciare un processo separato per ogni client con stdin e stdout 
rediretti sul socket (mi sembra che questo sia l'approccio "classico" 
in unix se il numero di connessioni contemporanee non è troppo 
elevato).
-- 
Valter Minute
min...@inwind.it
 (the reply address of this message is invalid)

Grazie mille x l'aiuto :))
Ursula
"Francesco Picasso" <s0...@libBero.it> ha scritto nel messaggio
news:k81d8uoe5h0l8g2ad...@4ax.com...
