Probl�mes sockets C++, c�t� client
Bonjour � tous :D
Voila je suis depuis tr�s longtemps confront� � un probl�me, qui est la communication entre un client et un serveur via les sockets en C++, tout deux sur le localhost.
Je m'explique :
Mon serveur � priori fonctionne, car j'arrive � m'y connecter avec un client telnet, ou m�me avec un client que j'avais r�alis� en Java. Donc de ce c�t� la, �a � l'air d'aller.
Toutefois, le client que j'ai fait en C++ ne veut pas se connecter, et pourtant je ne r�cup�re strictement aucun messages d'erreur.
Voici le code source du client (simplissime � souhait) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
#include <winsock2.h> /*socket*/
#include <stdio.h> /*printf*/
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
int n;
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2,0), &WSAData)!= 0 )
{
cout << " Erreur à l'initialisation du dll !" << endl;
exit(2);
}
else
{
SOCKET s_client;
s_client = socket(PF_INET, SOCK_STREAM, 0);
if (s_client == INVALID_SOCKET)
{
cout << " Erreur à l'initialisation du socket !" << endl;
exit(2);
}
SOCKADDR_IN server;
char buffer[4096];
char msg[256];
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(45624);
memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
cout << "avant bind" << endl;
bind(s_client, (SOCKADDR *)&server, sizeof(server));
cout << "apres bind" << endl;
connect(s_client, (SOCKADDR *)&server, sizeof(server));
cout << "apres connect " << endl;
while(1)
{
cout << " dans le while" << endl;
cin >> buffer;
send(s_client, buffer, sizeof(buffer), 0);
}
WSACleanup();
}
return 0;
} |
Sachant que le port que j'utilise (exemple ici 45624) est libre et que j'utilise le m�me des deux c�t�s, de m�me pour la configuration du serveur. Voici le code mon serveur :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <winsock2.h> //socket
#include <stdio.h> //printf
#include <iostream>
#include <string.h>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
char buffer[4096];
WSADATA WSAData;
if (WSAStartup(MAKEWORD(2,0), &WSAData) != 0)
{
cout << " Erreur à l'initialisation du dll !" << endl;
exit(2);
}
else
{
SOCKET s_server, s_client;
SOCKADDR_IN server;
SOCKADDR_IN client = { 0 };
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(45624);
memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
s_server = socket(AF_INET,SOCK_STREAM,0);
s_client = socket(AF_INET,SOCK_STREAM,0);
cout << "Demarrage serveur" << endl;
if (bind(s_server, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)
fprintf(stderr, "La fonction bind a echoue.\n");
else
{
while(1)
{
cout<< "on entre dans la boucle" << endl;
if (listen(s_server, 5) == SOCKET_ERROR) /* listen : commencer l'ecoute */
fprintf(stderr, "La fonction listen a echoue.\n");
else
{
int csize = sizeof(client);
s_client = accept(s_server, (SOCKADDR *)&client, &csize);
if (s_client == INVALID_SOCKET)
{
fprintf(stderr, "La fonction accept a echoue.\n");
}
else
{
char buffer[4096];
int n = 0;
printf("Le client %s s'est connecte !\n", inet_ntoa(client.sin_addr));
while(strcmp(buffer,"exit")!=0)
{
recv(s_client, buffer, sizeof(buffer) - 1, 0);
//cout << buffer << endl;
if (n != SOCKET_ERROR)
{
cout << buffer << endl;
}
strcpy(buffer,"");
}
closesocket(s_client);
}
}
}
WSACleanup();
}
}
return 0;
} |
Mon serveur est sens� afficher "Le client "IP_CLIENT" s'est connect�", ce qu'il fait avec tout mes autres clients, mais pas avec mon client C++.
Je crois avoir localis� le probl�me au niveau de "accept()", car il bloque ici j'ai l'impression.
Merci pour vos proposition je rame depuis trop longtemps :P
PS : Ca fait un moment que je cherche sur les forums aussi, mais je ne trouve pas ce probl�me
Cdt,
Vespiras