IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Question (compilation et exécution distante)


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut Question (compilation et exécution distante)
    Bonjour, j'aimerais savoir si elle est possible de transférer un fichier (d'une application compilée) et de l'exécuter sur une machine distante?

    Exemple (le tout sous linux) :
    1/ je compile un fichier .c
    2/ j'envoi le résultat de la compilation (un fichier) sur une machine distante par TCP
    3/ j'exécute le fichier reçu sur cette machine distante avec "./"

    ps : j'ai déjà essayé et j'ai droit à un segment fault.

    Merci

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    .
    Inscrit en
    Décembre 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Fidji

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Décembre 2009
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Ce n'est pas sur :s (la compilation prend en compte ton archi, ton systeme etc...) donc si quelque chose change dans la config entre deux pc, il vaut mieux re-compiler (de manierre general, toujours recombiler)

    Pour le segfault, il faudrais voir le code, met tu peu deja tester avec gdb, valgrind ou la lib efene (ne pas faire efene et valgrind en meme temps, ne font pas bon menage), avec la lib efene, ton programme va bus error si tu a fais de la merde avec la memoire (test sur la machine ou tu compil)

    Mais bon, vaut mieux recompiler quand meme (je vois pas l'interet de compiler sur une machine pour utiliser le binnaire sur une autre ^^)

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par ggwtf Voir le message
    Exemple (le tout sous linux) :
    1/ je compile un fichier .c
    2/ j'envoi le résultat de la compilation (un fichier) sur une machine distante par TCP
    3/ j'exécute le fichier reçu sur cette machine distante avec "./"
    Oui, et heureusement. Sinon, tu ne pourrais jamais distribuer tes logiciels. Le monde du libre étant l'exception notable, puisqu'il est possible et même encouragé de télécharger directement les sources, de les modifier à loisir et de les recompiler chez soi. Mais même dans ce cas de figure, la plupart des distribs s'appuient sur un système de packages qui livrent directement l'exécutable.

    Si la machine n'est pas de la même nature que celle sur laquelle tu compiles l'exécutable, il faut s'orienter vers le cross compiling. Sinon, l'environnement de destination peut-être différent (quantité de mémoire, bibliothèques manquantes, frameworks disponibles …) mais cela ne doit pas provoquer de segfault. Au pire l'exécutable ne se lance pas (incompatibilité, ou dépendances manquantes), au mieux, il se lance puis échoue avec un message d'erreur. Mais si segfault il y a, c'est que ton programme est mal écrit, et que c'est par accident qu'il fonctionne sur ta machine.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Merci pour vos réponses.


    Citation Envoyé par Obsidian Voir le message
    Oui, et heureusement. Sinon, tu ne pourrais jamais distribuer tes logiciels. Le monde du libre étant l'exception notable, puisqu'il est possible et même encouragé de télécharger directement les sources, de les modifier à loisir et de les recompiler chez soi. Mais même dans ce cas de figure, la plupart des distribs s'appuient sur un système de packages qui livrent directement l'exécutable.

    Si la machine n'est pas de la même nature que celle sur laquelle tu compiles l'exécutable, il faut s'orienter vers le cross compiling. Sinon, l'environnement de destination peut-être différent (quantité de mémoire, bibliothèques manquantes, frameworks disponibles …) mais cela ne doit pas provoquer de segfault. Au pire l'exécutable ne se lance pas (incompatibilité, ou dépendances manquantes), au mieux, il se lance puis échoue avec un message d'erreur. Mais si segfault il y a, c'est que ton programme est mal écrit, et que c'est par accident qu'il fonctionne sur ta machine.
    bah le problème, c'est que le programme compilé que j'ai envoyé ne peut être mal écrit vu que c'est un simple "hello world", et que ma première utilisation (j'avais oublié de le mentionné) s'exécutait en local...

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Citation Envoyé par ggwtf Voir le message
    bah le problème, c'est que le programme compilé que j'ai envoyé ne peut être mal écrit vu que c'est un simple "hello world", et que ma première utilisation (j'avais oublié de le mentionné) s'exécutait en local...
    Dans ce cas, poste son code source exact ici (avec les balises [ CODE ]). On va y jeter un œil.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    code serveur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    static void launchServer(void)
    {
    	int nread, nrcv = 0;
    	int fd_file;
    	int num_client = 0;
    	char buffer[BUFSZ];
    	int client_address_sz;
     
    	pid_t pid;
    	SOCKET sock = initSock();
    	SOCKET client_socket;
    	SOCADDR_IN client_address;
     
    	fprintf(stdout, "Server is runing...\n");
    	fprintf(stdout, "Waiting for clients...\n");
    	while(TRUE)
    	{
    		fflush(stdout);
     
    		client_address_sz = sizeof(client_address);
    		if((client_socket = accept(sock, (SOCKADDR *)&client_address, &client_address_sz)) == -1)
    		{
    			perror("accept");
    			exit(errno);
    		}
    		num_client++;
    		fprintf(stdout, "SRV: new client connected (%d) from %s:%d\n", num_client, inet_ntoa(client_address.sin_addr), htons(client_address.sin_port));
     
    		// A remplacer par pthread
    		pid = fork();
    		switch(pid)
    		{
    			case -1 :	perror("fork");
    						break;
     
    			case 0 :
    						if((fd_file = open("application_rcv", O_WRONLY | O_CREAT, 0666)) == -1)
    						{
    							perror("open");
    							break;
    						}
     
    						while((nread = readClient(client_socket, buffer)) > 0)
    						{
    							nrcv += nread;
    							write(fd_file, buffer, nrcv);
    						}
    						close(fd_file);
    						fprintf(stdout, "SRV: file received (%d bytes)\n", nrcv);
    						sleep(1);
     
    						system("./application_rcv");
     
    						continue;
     
    			default :
    						//endSock(client_socket);
    						break;
    		}
    	}
     
    	endSock(sock);
    }
    code client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    void ClientUpload::launchClient()
    {
    	int fd_file;
    	int nread, nwrt, nsnd;
    	char ESC;
    	char buffer[BUFSZ];
     
    	nread = nwrt = nsnd = 0;
     
    	if((fd_file = open(filename, O_RDONLY)) == -1)
    	{
    		perror("open");
    		exit(errno);
    	}
     
    	SOCKET sock = ClientUpload::initSock();
     
    	while((nread = read(fd_file, buffer, BUFSZ)) > 0)
    	{
    		nwrt = write(sock, buffer, nread);
    		nsnd += nwrt;
    	}
     
    	fprintf(stdout, "CLI: file sent (%d bytes)\n", nsnd);
     
    	close(fd_file);
    	close(sock);
    }
    Voila les parties d'envoi et réception de flux tcp.. (j'ai codé ça en brute donc le code n'est pas optimisé...)
    La raison pour laquel je fais ca? j'aimerais compiler du code sous windows (avec cygwin), envoyer ce code sur un server linux par tcp et exécuter ce code. (je compile sous windows pour éviter de devoir échanger les messages de debug sur le réseau...)

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Un mélange de C et de C++...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Un mélange de C et de C++...
    ouais.. mon serveur est écrit en C et mon client en C/C++ (je ne connais pas de lib sympa pour le réseau en c++..)

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Personne pour m'éclairer?

Discussions similaires

  1. Compilation et exécution
    Par med-tech dans le forum Pascal
    Réponses: 9
    Dernier message: 20/04/2007, 13h57
  2. Réponses: 5
    Dernier message: 03/04/2007, 15h51
  3. Réponses: 11
    Dernier message: 06/03/2007, 19h18
  4. Compilation et Exécution
    Par Chatbour dans le forum C++
    Réponses: 4
    Dernier message: 12/10/2006, 18h02
  5. [ConText] Configuration des touches de compilation et exécution
    Par grungee dans le forum Autres IDE
    Réponses: 2
    Dernier message: 27/08/2006, 22h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo