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

  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 154
    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 154
    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 154
    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 154
    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... .

  7. #7
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 154
    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 154
    Billets dans le blog
    4
    Par d�faut
    C'est pas des erreurs de compile mais de link.
    Tu link pas winsock2.
    La syntaxe pragma marche avec VS, apparemment pas avec C::B.
    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.

  8. #8
    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
    VS est beaucoup plus difficile a utiliser pour un d�butant je trouve, code::block est plus simple.


    J'ai r�ussi a linker winsock2 sans avoir eu a passer par VS, solution trouv�e sur stackoverflow:

    https://stackoverflow.com/questions/...to-wsastartup8


    Il suffit juste de renseigner lws2_32 comme option en ligne de commande, ce qui donne pour moi:
    Merci de votre aide, je passe en r�solu

+ 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