1 pièce(s) jointe(s)
Socket - Problème de communication client/serveur
Bonjour à tous !
C'est la première fois que je poste sur le forum consacré au C, mais il faut bien commencer un jour...
Bref, désolé de vous embêtez mais j'ai un petit soucis avec les sockets... Je code en C depuis très peu de temps, et me suis inspiré de différents tutoriels pour arriver au résultat suivant qui n'est pas brillant... Je n'ai, de plus, pas trouvé de solution à ce problème sur les topics existants (mais j'ai peut-être mal cherché !).
Mon souci avec ce code, c'est que j'aurais aimé réussir à faire communiquer un client et un serveur, chose qui fonctionne partiellement : vous constaterez si jamais vous jetez un oeil aux source que j'utilise pour récupérer les communications dans mon client et dans mon serveur un while. Le problème : à la deuxième éxécution de la boucle sur mon client la communication s'arrête entre les deux... Et il n'ya pas d'erreur concrète qui s'affiche ni sur l'un ni sur l'autre (le dernier envoi du serveur semble bon... Ca serait la récéption du client qui serait donc en cause ?).
Voila le code du client :
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
| //headers
#include <stdio.h>
#include <winsock2.h>
//libraries
#pragma comment(lib, "libws2_32.a")
int main()
{
//on initialise le fucking winsock >_<
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
//init socket de connexion
SOCKET s_con;
SOCKADDR_IN s_con_param;
s_con = socket(AF_INET, SOCK_STREAM, 0);
//init des variables du socket de connexion
s_con_param.sin_addr.s_addr = inet_addr("127.0.0.1");
s_con_param.sin_family = AF_INET;
s_con_param.sin_port = htons(58);
//on initialise le buffer qui va récupérer les chaines renvoyés par le serv, et le client
char buffer_serv[400];
char buffer_client[400];
char tempo [400];
//on initialise une variable "erreur" qui quand elle devient vrai termine la connexion avec le serveur
int error = 0;
//on initialise les variables d'envoi et de réception
int data_in;
int data_out;
connect(s_con, (SOCKADDR *)&s_con_param, sizeof(s_con_param));
int i = 0;
while (error != 1 && i<=3)
{
if (i == 0)
{
data_out = send(s_con, ">>first_connection", 18, 0);
}
else
{
data_out = send(s_con, "toto", 4, 0);
if (data_out != SOCKET_ERROR)
{
printf("Envoi OK\n");
}
else
{
printf("Erreur lors de l'envoi\n");
}
}
data_in = recv(s_con, buffer_serv, sizeof(buffer_serv), 0);
if (data_in != SOCKET_ERROR)
{
printf("%s",buffer_serv);
}
else
{
printf("Erreur de reception des donnees\n");
error = 1;
}
i++;
}
closesocket(s_con);
WSACleanup();
getchar();
exit(1);
} |
Et celui du 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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
//headers
#include <stdio.h>
#include <winsock2.h>
//libraries
#pragma comment(lib, "libws2_32.a")
int main()
{
//on initialise le fucking winsock >_<
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
//init socket d'écoute
SOCKET s_listen;
SOCKADDR_IN s_listen_param;
s_listen = socket(AF_INET, SOCK_STREAM, 0);
//init des variables du socket d'écoute
s_listen_param.sin_addr.s_addr = INADDR_ANY; //a voir
s_listen_param.sin_family = AF_INET; //idem
s_listen_param.sin_port = htons(58);
//on bind la total
bind(s_listen, (SOCKADDR *)&s_listen_param, sizeof(s_listen_param));
//on initialise le socket "client"
SOCKET s_client;
SOCKADDR_IN s_client_param;
//on initialise une variable "erreur" qui quand elle devient vrai termine la connexion avec le serveur
int error = 0;
//on initialise un buffer pour le client et le serveur afind e transmettre des communications
char buffer_serv[400];
char buffer_client[400];
//on initialise les variables d'envoi et de réception, de découpage de chaines
int data_in;
int data_out;
int first_time;
int shut;
if (listen(s_listen, 0) != SOCKET_ERROR)
{
printf("Server enabled !\n\nLooking for connections...\n");
while (error != 1)
{
int length = sizeof(s_client_param);
if ((s_client = accept(s_listen, (SOCKADDR *)&s_client_param, &length)) != INVALID_SOCKET)
{
data_in = recv(s_client,buffer_client,sizeof(buffer_client),0);
if (data_in != SOCKET_ERROR)
{
first_time = strcmp(buffer_client,">>first_connection");
shut = strcmp(buffer_client,">>shutdown");
if(first_time == 0)
{
data_out = send(s_client,"Welcome on Serv\n\n",22,0);
}
if (shut == 0)
{
error = 1;
}
else
{
printf("%s\n",buffer_client);
data_out = send(s_client,"\nBien recu\n",12,0);
if (data_out != SOCKET_ERROR)
{
printf("Envoi OK\n");
}
else
{
printf("Erreur lors de l'envoi\n");
}
}
}
else
{
printf("Erreur de reception des donnees\n");
error = 1;
}
}
else
{
printf("Ecoute refusee\n");
error = 1;
}
}
closesocket(s_client);
closesocket(s_listen);
WSACleanup();
exit(1);
}
else
{
printf("Failure...\n");
WSACleanup();
exit(1);
}
} |
Je me triture l'esprit depuis hier soir pour trouver une solution, mais je ne vois pas, c'est pourquoi je suis là :mrgreen:
Voila, si jamais quelqu'un a 10 minutes à perdre !!
Merci d'avance
PS : je développe sous windows avec devc++ et le compilateur gcc. Ci-joint une capture du résultat obtenu.