se ti interessa io avevo fatto questo qualche settimana fa, poi ho abbandonato tutto x la maturità e lo migliorerò in seguito
in pratica creca le connessioni e spedisce i msg ricevuti a tutti gli utenti connessi
codice:
#include <iostream>
#include "winsock2.h"
#include <string.h>
#define MAXmsg 100
#define MAXusr 100
using namespace std;
typedef struct {
        char name[20];
        SOCKET socket;
} user;

int main() {
     WSADATA wsaData;
     if ( WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR )
           cout<<"Error at WSAStartup()\n";
     SOCKET Socket;
     Socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
     if ( Socket == INVALID_SOCKET )
        {     
           cout<<"Error at socket():"<<WSAGetLastError()<<"\n";
           WSACleanup();
           return 1;}
     sockaddr_in service;
     service.sin_family = AF_INET;
     service.sin_addr.s_addr = inet_addr( "127.0.0.1" );
     service.sin_port = htons( 27015 );
     if ( bind( Socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
           cout<<"bind() failed.\n";
           closesocket(Socket);
           return 1;}
    //Listening on Socket
    listen( Socket, MAXusr );
    user utenti[MAXusr];
    int usr=0,z,j;
    long unsigned ioctl=1;   
    char sendbuf[MAXmsg] = "Server: Sending Data.";
    char recvbuf[MAXmsg] = "";
    ioctlsocket (Socket, FIONBIO, &ioctl);
    while(1)
    {
    if((utenti[usr].socket=accept( Socket, NULL, NULL ))!=INVALID_SOCKET)
    {      ioctlsocket (utenti[usr].socket, FIONBIO, &ioctl);
           recv(utenti[usr].socket,utenti[usr].name,20, 0 );
           cout<<"client "<<usr+1<<" connected as "<<utenti[usr].name<<"\n";
           usr++;
           }
    //Sending and Receiving Data
    for(z=0;z<MAXmsg;z++)
            recvbuf[z]='\0';
    //controllo tutti i client x msg
    for(z=0;z<usr;z++)
    {
           if(recv( utenti[z].socket, recvbuf, MAXmsg, 0 )!=0)
             for(j=0;j<usr;j++)
             {if(j!=z)
                   send( utenti[j].socket, recvbuf, strlen(recvbuf), 0 );}
    }
    }
    WSACleanup();
    system("PAUSE");
    return 0;
}