Client Serveur

glubust Messages postés 6 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 27 juillet 2004 - 15 juil. 2004 à 10:25
glubust Messages postés 6 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 27 juillet 2004 - 19 juil. 2004 à 23:42
J'aimerais faire fonctionner une application client/serveur sous UNIX (client) et WINDOWS (serveur).

Pouvez vous me dire si cela est possible ?
Avez vous des sources qui pourraient m'aider ? J'ai fais un serveur qui fonctionne sous win, un client qui fonctionne sous unix, mais je n'arrive pas à faire fonctionner les deux en même temps : la connexion à l'air de se faire, mais aucune transmissions !!!

Merci pour vos reponses !

3 réponses

cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
16 juil. 2004 à 01:15
ben oui ca peut se faire, aucun probleme...
mtnt sans code, on peut pas te dire a quoi est du ton probleme.
a+
0
glubust Messages postés 6 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 27 juillet 2004
19 juil. 2004 à 10:16
Ca peux se faire ! Bien, je n'y croyais plus...

Voici les sources ;

===================================
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);
}

=========================================

Merci pour votre aide !

++
0
glubust Messages postés 6 Date d'inscription mardi 13 juillet 2004 Statut Membre Dernière intervention 27 juillet 2004
19 juil. 2004 à 23:42
Explication du prog :
Le programme client envoi une requete au serveur (style "copy ...", "lance.bat") qui l'exucute et renvoi son code retour au client.

Ex : client "d:\lance.bat" (unix)
=> d:\lance.bat est execute sur le serveur (win)
0
Rejoignez-nous