Client/Serveur, encore.....

glubust Messages postés 6 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 27 juillet 2004 - 22 juil. 2004 à 10:38
amenir Messages postés 3 Date d'inscription mardi 17 mars 2009 Statut Membre Dernière intervention 19 mai 2009 - 18 mai 2009 à 15:22
Je veux faire fonctionner une application client/serveur sous UNIX (client) et WINDOWS (serveur).
Le programme client envoi une simple requête au serveur ("copy ...", "lance.bat") qui l'exécute et renvoi son code retour au client (début d'un mini Ordonnanceur).
Ex : client "d:\lance.bat" (unix)
=> d:\lance.bat est exécute sur le serveur (win)

La connexion à l'air de se faire, mais aucune transmission !
Please?..HEEEEELP !

===================================
Serveur sous Windows
===================================
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#include <time.h>
#include
#include <ctype.h>

#pragma comment(lib, "ws2_32.lib")

#define LG_MAX_REQUETE 1024
#define LEPORT 4150

void traitement(SOCKET);

void main()
{
int val,erreur;
WSADATA wsa;

char ladate[10],
lheure[10];

SOCKET serveur;
SOCKET client;
SOCKADDR_IN sin;
SOCKADDR_IN clientsin;

/* initialisation */
WSAStartup(MAKEWORD(2,0), &wsa);

/* creation de la socket serveur */
serveur=socket(AF_INET,SOCK_STREAM,0);
if(serveur==INVALID_SOCKET)
{
perror("erreur de creation de la socket");
exit(-1);
}
/* configuration de la socket */
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_family = AF_INET;
sin.sin_port = htons(LEPORT);

/* attacher le socket au n° de port*/
erreur=bind(serveur,(SOCKADDR *)&sin, sizeof(sin));
if(erreur == INVALID_SOCKET)
{
perror("bind");
exit(-1);
}

/* Recuperation de la date et heure courante */
_strdate(ladate);
_strtime(lheure);

/* creation d'une file d'attente de demande de connexion */
listen(serveur,0);
val=sizeof(clientsin);

printf("\tServeur en route le %s a %s\n",ladate,lheure);
while(1)
{
/* accepter une connexion */
client=accept(serveur,(SOCKADDR *)&clientsin,&val);
if(client == INVALID_SOCKET)
{
perror("erreur de connection");
exit(-1);
}
/* fonction qui utilise la socket */
traitement(client);
}
}
/**************************************************************
traitement
traite la requete envoyer par le client
**************************************************************/

void traitement(SOCKET client)
{
int lg, /* longueur de la chaine reçue */
ret=0, /* code retour de la ligne de commande executee */
retrex=0; /* code retour du rex */

char recu[LG_MAX_REQUETE], /* message recu du client */
envoi[LG_MAX_REQUETE], /* message envoye au client */
date[10], /* date systeme */
heure[10]; /* heure systeme */

/* attendre la reception d'une requete sur la socket "client" */
lg=recv(client,recu,LG_MAX_REQUETE,0);
recu[lg]='\0';

memset(envoi,' ',LG_MAX_REQUETE);

/* Recuperation de la date et heure courante */
_strdate(date);
_strtime(heure);

printf("Execution %s-%s : %s\n",date,heure,recu);

/* execution de la ligne de commande passe en parametre */
ret=system(recu);

/* Recuperation de la date et heure courante */
_strdate(date);
_strtime(heure);

printf("Ret system : %d - Termine %s-%s\n",ret,date,heure);

sprintf(envoi, "Termine le %s a %s",date,heure);
lg=strlen(envoi);

/* envoyer une requete sur la socket "client" */
send(client,envoi,lg,0);
}
}

===================================
Client sous Unix
===================================
#include <stdio.h>
#include <errno.h>
#include <signal.h>

#include <time.h>

#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define SERVEURNAME "172.17.112.52" /* SDIPROD */
#define LG_MAX_REQUETE 1024
#define PORT 4150

int to_server_socket = -1;

void traitement(struct sockaddr_in, char *);

int main (int argc, char **argv) {

char *server_name = SERVEURNAME;

struct sockaddr_in serverSockAddr;
struct hostent *serverHostEnt;

long hostAddr;
long status;

/* Connexion au serveur */
bzero(&serverSockAddr,sizeof(serverSockAddr));
hostAddr = inet_addr(SERVEURNAME);
if ( (long)hostAddr != (long)-1) bcopy(&hostAddr,&serverSockAddr.sin_addr,sizeof(hostAddr));
else {
serverHostEnt = gethostbyname(SERVEURNAME);
if (serverHostEnt == NULL) {
printf("Probleme gethost\n");
return(-1);
}
bcopy(serverHostEnt->h_addr,&serverSockAddr.sin_addr,serverHostEnt->h_length);
}
serverSockAddr.sin_port = htons(PORT);
serverSockAddr.sin_family = AF_INET;

/* Creation de la socket */
if ( (to_server_socket = socket(AF_INET,SOCK_STREAM,0)) < 0) {
printf("Probleme creation socket client\n");
return(-1);
}

/* Requete de connexion */
if(connect( to_server_socket, (struct sockaddr *)&serverSockAddr, sizeof(serverSockAddr)) < 0 ) {
printf("Probleme demande de connection\n");
return(-1);
}

traitement(serverSockAddr,argv[1]);

/* Fermeture de la connection */
shutdown(to_server_socket,2);
close(to_server_socket);

return(0);
}

void traitement(struct sockaddr_in lasocket, char *commande) {
int lg;

char recu[LG_MAX_REQUETE];

struct tm *t;

/* Recuperation de la date et heure courante */
time_t ti=time(0);
t=localtime(&ti);

memset(recu,' ',LG_MAX_REQUETE);

printf("Envoi au serveur le %.2u/%.2u/%.2u a %.2u:%.2u:%.2u :\n[%s]\n",t->tm_year,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec,commande);

/* Envoie donnees au serveur */
write(lasocket,commande,strlen(commande));

/* Receptionne + affiche les donnees envoyees par le serveur */
read(lasocket,recu,LG_MAX_REQUETE);

printf("[%s]",recu);
}

8 réponses

dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
24 juil. 2004 à 00:08
qu'entend tu par la connection a l'air de se faire?
Le bind() se fait il correctement? le port est il reservé?

sin.sin_addr.s_addr = INADDR_ANY;
ca ca veut bien dire que tu laisse le pc choisir l'ip non? Si c'est le cas comment le client peut il se connecter au serveur sans savoir de quel pc il s'agit?

Mais on vu que je debute en prog reseau je dis peut etre des conneries...
0
glubust Messages postés 6 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 27 juillet 2004
26 juil. 2004 à 14:30
Et bien le client se connecte bien au serveur (bind ok), le port est bien réservé.

Le client se connecte au serveur à l'aide de l'IP que je lui donne en argument (#define SERVEURNAME) et au port que je lui indique (#define PORT 4150).

Ca c'est correct, mais le soucis c'est que le serveur ne reçois pas les infos que le client lui envoi.

Et la c'est la grosse nébuleuse pour moi étant donné que je débute aussi.
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
26 juil. 2004 à 15:57
essaie pour voir avec le port: 27015
et l'ip tu lui met quoi? Ce que je ne comprends toujours pas c'est a la ligne ou tu defini l'ip du serveur dans le code du serveur:

sin.sin_addr.s_addr = INADDR_ANY;
moije mettrais sin.sin_addr.s_addr = "62.14.78.45"; par exemple...

d'ailleurs sans le code du serveur au moment de l'initialisation pour ensuite executer le bind je ne vois pas de serveurname
Mais bon si ca fonctionne bien comme ca...
Et pour les erreur utilise WSAGetLastError qui contient la derniere erreur dans le socket.tu pourras peut etre y voir ou est le probleme...
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
26 juil. 2004 à 15:57
essaie pour voir avec le port: 27015
et l'ip tu lui met quoi? Ce que je ne comprends toujours pas c'est a la ligne ou tu defini l'ip du serveur dans le code du serveur:

sin.sin_addr.s_addr = INADDR_ANY;
moije mettrais sin.sin_addr.s_addr = "62.14.78.45"; par exemple...

d'ailleurs sans le code du serveur au moment de l'initialisation pour ensuite executer le bind je ne vois pas de serveurname
Mais bon si ca fonctionne bien comme ca...
Et pour les erreur utilise WSAGetLastError qui contient la derniere erreur dans le socket.tu pourras peut etre y voir ou est le probleme...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
glubust Messages postés 6 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 27 juillet 2004
27 juil. 2004 à 15:03
OK, merci, je vais voir avec WSAGetLastError pour voir si je trouve l'erreur.

A vrai dire, pour l'adresse IP, j'ai recupéré un programme qui fonctionnait comme ca, j'ai pas cherché a changer le INADDR_ANY.

Je te tiens au courant si j'avance....

Encore merci !
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
27 juil. 2004 à 16:17
ok!
0
bakfouad Messages postés 1 Date d'inscription dimanche 15 mai 2005 Statut Membre Dernière intervention 15 mai 2005
15 mai 2005 à 11:05
bakfouad
0
amenir Messages postés 3 Date d'inscription mardi 17 mars 2009 Statut Membre Dernière intervention 19 mai 2009
18 mai 2009 à 15:22
SALUT
svp, aidez moi
je suis entrain de faire un projet de fin d'etude : envoi d'alerte entre serveur et client par snmp
interface avec c++  tres leger
0
Rejoignez-nous