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 <process.h>
#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);
}