Client/Serveur, encore.....

Signaler
Messages postés
6
Date d'inscription
mardi 13 juillet 2004
Statut
Membre
Dernière intervention
27 juillet 2004
-
Messages postés
3
Date d'inscription
mardi 17 mars 2009
Statut
Membre
Dernière intervention
19 mai 2009
-
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

Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
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...
Messages postés
6
Date d'inscription
mardi 13 juillet 2004
Statut
Membre
Dernière intervention
27 juillet 2004

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.
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
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...
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
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...
Messages postés
6
Date d'inscription
mardi 13 juillet 2004
Statut
Membre
Dernière intervention
27 juillet 2004

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 !
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008
1
ok!
Messages postés
1
Date d'inscription
dimanche 15 mai 2005
Statut
Membre
Dernière intervention
15 mai 2005

bakfouad
Messages postés
3
Date d'inscription
mardi 17 mars 2009
Statut
Membre
Dernière intervention
19 mai 2009

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