Bonjour,
j'essaye de developper avec c++ une application de chat (client-server) sous windows, en voici le code:
Server server;
Client client;
void main() {
int nResult; // Retour des fonctions
char choix;
WORD wVersionRequested = WINSOCK_REQ_VERSION;
WSADATA wsaData;
nResult = WSAStartup(wVersionRequested, &wsaData);
if (wsaData.wVersion != wVersionRequested) {
cout<<"\nWinSock version 2.2 requis\n"<<endl;
return;
}
cout<<"Pour le mode serveur taper s"<<endl;
cout<<"Pour le mode client taper c"<<endl;
cin>>choix;
/********************Partie serveur***************************/
if(choix=='s' || choix=='S')
{
sockaddr_in ServerAddr; // Adresse locale
int port = PORT;
ServerAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(7001);
cout<<inet_ntoa(ServerAddr.sin_addr)<<endl;
server.n_connected=0;
server.s_socket = socket(AF_INET,SOCK_STREAM,0); // Ouverture du socket
int sizeAddr = sizeof(ServerAddr);
if( bind(server.s_socket,(sockaddr*)&ServerAddr,sizeAddr)==-1){cout<<"erreur bind"<<endl;} // Association du socket à un point de communication
else cout<<" bind success"<<endl;
if(listen(server.s_socket, 3)==-1) {cout<<"erreur listen"<<endl;} // met le socket en écoute
else cout<<"listen success"<<endl;
SOCKET s; //socket temporaire
SOCKADDR_IN csin; // addr temporaire
int sinsize= sizeof(csin);
while(1){
if(s=accept(server.s_socket,(SOCKADDR *)&csin,&sinsize)!= INVALID_SOCKET)
{
cout<<"\nVient de se connecter: "<<inet_ntoa(csin.sin_addr)<<":"<<ntohs(csin.sin_port)<<endl;
int i=server.n_connected;
cout<<"socket server"<<server.s_socket<<endl;
if(i < Max_Connection)
{
server.s_client[i].c_socket=s;
server.s_client[i].c_csin=csin;
server.s_client[i].isConnected=true;
server.n_connected++;
server.s_client[i-1].c_h=CreateThread(NULL,0,ReceiverThread,NULL,0,NULL);
}
else cout<<"Too many connections. "<<endl;
}
}
}
/******************Partie client****************************/
if(choix=='c' || choix=='C')
{
client.c_csin.sin_addr.s_addr = inet_addr("127.0.0.1");
client.c_csin.sin_family = AF_INET;
client.c_csin.sin_port = htons(7001);
client.isConnected = false;
client.c_socket = socket(AF_INET,SOCK_STREAM,0);
int cnt=connect(client.c_socket,(SOCKADDR *)&client.c_csin,sizeof(client.c_csin));
if(cnt<0) cout<<"connect socket error"<<endl;
else cout<<"connexion etablie "<<endl;
//thread d'envoie
char Buffer[100];
while(1)
{
cin>>Buffer;
int rc=send(client.c_socket,Buffer,sizeof(Buffer),0);
if(rc!=sizeof(Buffer)) cout<<"erreur envoie"<<endl;
else cout<<"send success"<<endl;
}
//thread de reception
CreateThread(NULL,0,ReceiveClient,NULL,0,NULL);
}
}
/****************Definition des fonctions******************************/
DWORD WINAPI ReceiverThread(LPVOID pParam){
char Buffer[1024]="\0";
int i= server.n_connected-1;
char msg[]="Bienvenue";
int rc= send(server.s_client[i].c_socket,msg,sizeof(msg),0);
if(rc !=sizeof(msg)) cout<<"erreur envoie 1"<<endl;
cout<<"nbre connect "<<server.n_connected<<endl;
do{
i= server.n_connected-1;
SOCKET s=server.s_client[i].c_socket;
recv(s,Buffer,sizeof(Buffer),1);
printf("\r%s:%d> %s", inet_ntoa(server.s_client[i].c_csin.sin_addr),
ntohs(server.s_client[i].c_csin.sin_port),
Buffer);
if(strcmp(Buffer,"quit")==0)
{
server.s_client[i].isConnected=false;
closesocket(server.s_client[i].c_socket);
server.n_connected--;
}
for(int j=0;j<3;j++)
{
if(server.s_client[j].isConnected==true && j!=i)
send(server.s_client[j].c_socket,Buffer,sizeof(Buffer),0);
}
memset(Buffer,'\0',1024*sizeof(char));
}
while(server.s_client[i].isConnected==true);
return 0;
}
DWORD WINAPI ReceiveClient(LPVOID pParam){
char Buffer[1024];
while(1)
{
recv(client.c_socket,Buffer,sizeof(Buffer),0);
cout<<Buffer<<endl;
memset(Buffer,'\0',1024*sizeof(char));
}
return 0;
}
/********** fichier.h**********************/
struct Client {
HANDLE c_h;
SOCKET c_socket;
SOCKADDR_IN c_csin;
bool isConnected;
};
struct Server {
HANDLE s_h;
SOCKET s_socket;
Client s_client[Max_Connection-1];
int n_connected;
};
le probleme c'est que le serveur apres avoir accepté la connexion, il arrive pas a communiquer avec les clients, j'ai tjrs des erreurs au niveau de la fonction send. j'ai essayé de faire un cout sur l'id du socket cree par la fonction accept() et ce qui est bizarre c'est que je trouve tjrs la meme valeur (s=1) pour tous les clients. est ce que vous aurez une solution ?