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

Réseau C Discussion :

Créer un socket windows a travers C et le compiler


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Par défaut Créer un socket windows a travers C et le compiler
    Bonjour


    Je débute en C ( le C et la compilation c'est tout nouveau pour moi, je suis familiariser avec bash ).Je souhaite créer un socket en C pour windows afin de me connecter sur mon serveur web sous linux.Le code est ultra simple a comprendre.(Ne riez pas je suis un étudiant qui apprends peu a peu la programmation haha)

    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
    #include <sys/types.h>
    #include <winsock2.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
    #include <Ws2tcpip.h>
     
    #define BUF_SIZE 500
     
    int main(int argc, char *argv[])
    {
    	int sfd;
    	char buf[500];
    	struct sockaddr_in servaddr, cli;
    	int tmp = 0;
     
    	sfd = socket(AF_INET, SOCK_STREAM, 0);
        	bzero(&servaddr, sizeof(servaddr));
    	servaddr.sin_family = AF_INET;
    	servaddr.sin_addr = inet_addr("127.0.0.1");
    	servaddr.sin_port = htons(8080);
    	if (connect(sfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != -1)
    		0;
    	else
    		close(sfd);
     
    	while (read(sfd, buf, 500) > 0)
    	{
    		int (*foo)() = (int(*)())buf;
    		tmp = foo();
    	}
    }

    Mais quand je tente de le compiler avec Codeblock20.03 j'obtiens l'erreur suivante dans les logs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Users\Propriétaire\Desktop\test.c|21|error: incompatible types when assigning to type 'struct in_addr' from type 'long unsigned int'|
    Qu'ai-je oublier ?

    Merci a vous

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Déjà un peu de vocabulaire.
    Tu ne compiles pas un socket, tu compiles un programme.
    Que le programme crée et utilise un socket ce n'est qu'un détail du programme.
    Et ce n'est pas à travers C mais en langage C.

    Ensuite, il manque l'initialisation de winsock, obligatoire pour utiliser l'API socket sous Windows.
    Et il faut aussi lier la lib socket, probablement Winsock2 via Ws2_32.lib.
    Maintenant tu peux créer un socket.
    Ton code est incorrect, l'as-tu mal copié ? C'est le champ s_addr de sin_addr qui doit être assigné avec le retour de inet_addr.
    Et il faut vérifier que tu aies réussi à créer le socket au préalable.
    Si tu échoues le connect et fermes ton socket, tu ne pourras pas lire de données.
    Enfin, pour fermer le socket sous Windows c'est closesocket. Et pour recevoir des données c'est recv.

    Mais je vois pas trop ce que tu espères faire, parce que caster un buffer arbitraire reçu vers une adresse de fonction à appeler... j'ai envie de dire bonne chance pour que ça donne un résultat autre qu'un gros crash ou une corruption mémoire de folie.

    https://bousk.developpez.com/cours/r...emiers-pas/#LI
    https://bousk.developpez.com/cours/r...reception/#LII
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Par défaut
    Tout d'abord merci de ta réponse



    Ton code est incorrect, l'as-tu mal copié ?

    C'est un morceau de code que j'ai trouvé sur stackoverflow que j'ai légèrement modifier pour adapter a mes besoins.

    C'est le champ s_addr de sin_addr qui doit être assigné avec le retour de inet_addr.
    ce qui donnerai quelque chose comme ça ligne 21 ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inet_aton("127.0.0.1", &servaddr.sin_addr);
    Merci pour tes liens, je vais me pencher dessus

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Par défaut
    J'avance (petit a petit) dans ma création de socket sous windows.Si j'ai bien compris mon code doit se structurer ainsi:

    Initialisation de winsock
    Création du socket
    Pointage vers l'adresse et le port voulu
    Mise en écoute du socket windows
    En attente de la connexion
    Fermeture du socket si il y a erreur lors de la connexion

    Donc en concret ça donnerai ça:

    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
    /*
    	Create a TCP socket
    */
     
    #include<stdio.h>
    #include<winsock2.h>
     
    #pragma comment(lib,"ws2_32.lib") // librairie ws_32.lib utilisé pour le winsock
     
    int main(int argc , char *argv[])
    {
    	WSADATA wsa;
    	SOCKET s;
    	struct sockaddr_in server;
     
    	printf("\nLancement de winsock...");
    	if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    	{
    		printf("Erreur lors de l'initialisation de winsock : %d",WSAGetLastError());
    		return 1;
    	}
     
    	printf("Lancement du socket.\n");
     
     
    	if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
    	{
    		printf("Erreur socket non valide : %d" , WSAGetLastError());
    	}
     
    	printf("Socket crée.\n");
     
     
    	server.sin_addr.s_addr = inet_addr("127.0.0.1");
    	server.sin_family = AF_INET;
    	server.sin_port = htons( 8080 );
     
    	//Connexion au serveur
    	if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
    	{
    		puts("Erreur de connexion");
    		return 1;
    	}
     
    	puts("Connecté");
     
    	return 0;
    }

    Ce code me semble bon mais vu que je débute et que c'est la première fois que je tente de créer un socket je dois forcément oublier quelque chose... J'ai toujours des erreurs quand je tente de le compiler avec code::blocks 20.03, c'est quoi que je loupe ?

    Je remercie d'avance celui ou celle qui m'expliquera mes erreurs

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par david633 Voir le message
    J'ai toujours des erreurs quand je tente de le compiler avec code::blocks 20.03
    Qui sont ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 16
    Par défaut
    Autant pour moi, j'aurais du mettre les logs.Voici les logs de code::block lors de la tentative de compilation :




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    -------------- Build file: "no target" in "no project" (compiler: unknown)---------------
     
    gcc.exe   -c C:\Users\Propriétaire\Desktop\test2.c -o C:\Users\Propriétaire\Desktop\test2.o
    gcc.exe  -o C:\Users\Propriétaire\Desktop\test2.exe C:\Users\Propriétaire\Desktop\test2.o   
    C:\Users\Propriétaire\Desktop\test2.o:test2.c:(.text+0x37): undefined reference to `WSAStartup@8'
    C:\Users\Propriétaire\Desktop\test2.o:test2.c:(.text+0x43): undefined reference to `WSAGetLastError@0'
    C:\Users\Propriétaire\Desktop\test2.o:test2.c:(.text+0x85): undefined reference to `socket@12'
    C:\Users\Propriétaire\Desktop\test2.o:test2.c:(.text+0x96): undefined reference to `WSAGetLastError@0'
    C:\Users\Propriétaire\Desktop\test2.o:test2.c:(.text+0xbe): undefined reference to `inet_addr@4'
    C:\Users\Propriétaire\Desktop\test2.o:test2.c:(.text+0xdc): undefined reference to `htons@4'
    C:\Users\Propriétaire\Desktop\test2.o:test2.c:(.text+0x103): undefined reference to `connect@12'
    collect2.exe: error: ld returned 1 exit status
    Process terminated with status 1 (0 minute(s), 0 second(s))
    8 error(s), 0 warning(s) (0 minute(s), 0 second(s))

    C'est tout bete je suppose mais je bloque dessus... .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer un service Windows (pour exécuter une application)
    Par drinkmilk dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 16/08/2007, 11h24
  2. [SOCKET] Windows et linux
    Par Gmrinfo dans le forum C++
    Réponses: 3
    Dernier message: 21/02/2006, 22h44
  3. [Eclipse] créer un service Windows avec Eclipse
    Par tck-lt dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 19/09/2005, 17h28
  4. [socket & windows & accept]
    Par Magique dans le forum Réseau
    Réponses: 7
    Dernier message: 30/04/2004, 23h34
  5. créer une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    Réponses: 3
    Dernier message: 01/10/2002, 16h48

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