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;
}