Newsgroup: it.comp.lang.c++
Titolo: Server socket multithread

Sto relaizzando un server multithread in C.
Devo fare in modo che quando un client spedisce un messaggio al server, tale
server lo legge e spedisce un messaggio di risposta a TUTTI I CLIENT
COLLEGATI.
Il problema è che tale messaggio riesco a mandarlo soltanto al client che mi
ha effettivamente spedito il messaggio.... come se gli altri messagggi
rimanessero in coda in un buffer.
Dove è l'errore.
Vi posto la parte del codice sorgente che mi da problemi....e grazie a chi
puo aiutarmi.
Se qualcuno vuole, posso spedirgli il codice completo per farne il debug.
Marco.
//// Constants /////////////////////////////////////////////////////////
const int kBufferSize = 1024;
const int MAXCONN = 200;
int ActiveConn = 0;
SOCKET ArraySock[MAXCONN];
void AcceptConnections(SOCKET ListeningSocket)
{
    sockaddr_in sinRemote;
    int nAddrSize = sizeof(sinRemote);
    while (1) {
        SOCKET sd = accept(ListeningSocket, (sockaddr*)&sinRemote,
                &nAddrSize);
        if (sd != INVALID_SOCKET) {
            cout << "Accepted connection from " <<
                    inet_ntoa(sinRemote.sin_addr) << ":" <<
                    ntohs(sinRemote.sin_port) << "." <<
                    endl;
            DWORD nThreadID;
   ActiveConn = ActiveConn + 1;
   ArraySock[ActiveConn] = sd;
   CreateThread(0, 0, EchoHandler, (void*)sd, 0, &nThreadID);
        }
        else {
            cerr << WSAGetLastErrorMessage("accept() failed") <<
                    endl;
            return;
        }
    }
}
DWORD WINAPI EchoHandler(void* sd_)
{
    int nRetval = 0;
    SOCKET sd = (SOCKET)sd_;
    if (!EchoIncomingPackets(sd)) {
        cerr << endl << WSAGetLastErrorMessage(
                "Echo incoming packets failed") << endl;
        nRetval = 3;
    }
    cout << "Shutting connection down..." << flush;
    if (ShutdownConnection(sd)) {
        cout << "Connection is down." << endl;
    }
    else {
        cerr << endl << WSAGetLastErrorMessage(
                "Connection shutdown failed") << endl;
        nRetval = 3;
    }
    return nRetval;
}
bool EchoIncomingPackets(SOCKET sd)
{
    // Read data from client
    char acReadBuffer[kBufferSize];
    int nReadBytes;
 int nTemp;
    do {
        nReadBytes = recv(sd, acReadBuffer, kBufferSize, 0);
        if (nReadBytes > 0) {
            cout << "Valore di nReadBytes " << nReadBytes << endl;
   cout << "valore di sd  :  " << sd << endl;
   for (int k = 1; k < 4; k = k + 1) {
    cout << "Valore di K - Array  :  " << k << " -- " << ArraySock[k] <<
endl;
    nTemp = send(ArraySock[k], "Ciao", strlen ("Ciao")+1, 0);
    cout << "valore di ntemp : " << nTemp << endl;
    if (nTemp > 0)
     {
      cout << "risp. al client ArraySock= " << ArraySock[k] << endl;
                 }
                else if (nTemp == SOCKET_ERROR) {
                    return false;
                }
                else {
                    // Client closed connection before we could reply to
                    // all the data it sent, so bomb out early.
                    cout << "Peer unexpectedly dropped connection!" <<
                            endl;
                    return true;
                }
   }
        }
        else if (nReadBytes == SOCKET_ERROR) {
            return false;
        }
    } while (nReadBytes != 0);
    cout << "Connection closed by peer." << endl;
    return true;
}

Ciao,
Questo newsgroup si occupa del linguaggio C++ (e non del C!!) in quanto
tale, 
e non di aspetti specifici di particolari implementazioni. Per questo
non e' il
posto piu' adatto per porre domande specifiche come la tua.
Potresti avere piu' fortuna su uno dei seguenti gruppi:
Per Win32 (95, 98, NT): it.comp.programmare.win32
Per Linux:      it.comp.os.linux.development
Grazie,
Nicola Musatti