Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sockets

    7 juin 2006 à 14:06:56

    Bonjour, j'ai plusieurs questions sur les socket :
    Deja comment on sait le port de son ordi ? (mon ordi= le serveur)
    le client peut envoyer par socket au serveur ? : une variable repertoire=opendir("C:\\........................"); et que le serveur grace a cette variable affiche le contenue du repertoir du client ?
    Peut on envoyer un fichier de client a serveur avec une variable fichier=fopen("fichier.txt"); ??

    Voila a peu pres toutes mes questions :)
    • Partager sur Facebook
    • Partager sur Twitter
      7 juin 2006 à 14:10:39

      Ton ordi a plusieurs port. Quand tu utilise les sockets, c'est toi qui choisi le port a ouvrir.
      On peut envoyer par les socket un string, une chaine de caractère. Si tu veux envoyer un fichier il faudra le convertir en une chaine de caractère.
      • Partager sur Facebook
      • Partager sur Twitter
        7 juin 2006 à 15:13:58

        Citation : lapras123

        Bonjour, j'ai plusieurs questions sur les socket :
        Deja comment on sait le port de son ordi ? (mon ordi= le serveur)


        A chaque interface (Adresse IP) il peut y avoir 65535 ports. Si c'est un serveur, tu lui dis d'écouter tel ou tel port selon le service ou protocole désiré (certains numéros sont normalisés, d'autres libres pour des applications 'maisons')
        • 23 : telnet
        • 80 : http

        etc, je te laisse fouiller les RFC pour les détails, Google est ton ami...

        Citation : Pas de titre


        le client peut envoyer par socket au serveur ? : une variable repertoire=opendir("C:\\........................"); et que le serveur grace a cette variable affiche le contenue du repertoir du client ?


        Tu peux envoyer une chaine de caractères, la recevoir, l'interpréter et exécuter la commande correspondante, oui. C'est une question d'application. Les sockets ne font que tranporter les données d'une machine à l'autre (sockets IP) ou d'une application à l'autre avec les sockets internes dits 'UNIX'.

        Citation : Pas de titre


        Peut on envoyer un fichier de client a serveur avec une variable fichier=fopen("fichier.txt"); ??


        Oui. Il y a même des protocoles faits pour ça : ftp, tftp etc.

        Au fait, rien de ceci n'a à voir avec le langage C.

        Mise en oeuvre :

        http://mapage.noos.fr/emdel/reseaux.htm
        • Partager sur Facebook
        • Partager sur Twitter
        Music only !
          7 juin 2006 à 15:21:43

          Ok moi je veux faire un port pour un ordi a un autre.
          Le port est : 23 ?
          • Partager sur Facebook
          • Partager sur Twitter
            7 juin 2006 à 15:30:26

            Citation : lapras123

            Ok moi je veux faire un port pour un ordi a un autre.
            Le port est : 23 ?


            C'est pas clair. Tu veux faire une application maison ? Il faut que tu cherches un port libre dans la liste des ports (probablement > 1024)

            Disons 65000.
            • Sur le serveur, tu dis "écouter le port 65000 de n'importe quel IP"
            • Sur le client du dis "me connecter au port 65000 avec l'adresse IP du serveur". Voilà, c'est tout.
            • Partager sur Facebook
            • Partager sur Twitter
            Music only !
              7 juin 2006 à 16:05:03

              Ok voila :)
              Fautr que je passe client.c a un copain et qu'on lance tous les deux le fichier ?
              • Partager sur Facebook
              • Partager sur Twitter
                7 juin 2006 à 16:37:18

                On capte rien à ce que tu racontes : la théorie n'est pas maîtrisée. Essaye d'en apprendre un peu plus sur les réseaux avant de te lancer dans la programmation réseau avec les sockets.
                • Partager sur Facebook
                • Partager sur Twitter
                  7 juin 2006 à 16:49:29

                  Citation : lapras123

                  Ok voila :)
                  Fautr que je passe client.c a un copain et qu'on lance tous les deux le fichier ?


                  Oui, enfin, le serveur doit être lancé avant le client...
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Music only !
                    7 juin 2006 à 17:04:21

                    j'ai écri deux codes :

                    code client :


                    #include <stdio.h>
                    #include <stdlib.h>
                    #include <winsock2.h>
                    #pragma comment(lib, "ws2_32.lib")


                    int main(void)
                    {
                    WSADATA WSAdata;
                    WSAStartup(MAKEWORD(2,0), &WSAdata);
                    SOCKET sock;
                    SOCKADDR_IN sin;
                    char *buffer;
                    sin.sin_addr.s_addr = inet_addr("ip");
                    sin.sin_family = AF_INET;
                    sin.sin_port = htons(6667);
                    sock=socket(AF_INET, SOCK_STREAM, 0);
                    connect(sock, (SOCKADDR *)&sin, sizeof(sin));
                    recv(sock, buffer, sizeof(buffer), 0);
                    closesocket(sock);
                    WSACleanup();
                    system("PAUSE");
                    return 0;
                    }



                    Code serveur :

                    #include <stdio.h>
                    #include <stdlib.h>
                    #include <winsock2.h>
                    #pragma comment(lib, "ws2_32.lib")

                    int main(void)
                    {
                    WSADATA WSAdata;
                    SOCKET sock;
                    SOCKET csock;
                    sock=socket(AF_INET, SOCK_STREAM, 0);
                    SOCKADDR_IN sin;
                    SOCKADDR_IN csin;
                    sin.sin_addr.s_addr = INADDR_ANY;
                    sin.sin_family = AF_INET;
                    sin.sin_port = htons(6667);
                    bind(sock, (SOCKADDR *)&sin, sizeof(sin));
                    listen(sock, 0);
                    while(1)
                    {
                    int size=sizeof(csin);
                    csock=accept(sock, (SOCKADDR *)&sin, &size);
                    if(csock != INVALID_SOCKET) {
                    send(csock, "Hello world\r\n", 14, 0);
                    }
                    }
                    system("PAUSE");
                    return 0;
                    }


                    Le programme se lance pas : linker error !!
                    Exemple de linker error :
                    undefined reference to socket@12 ect...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 juin 2006 à 22:32:20

                      Normal tu as oublié de mettre dans sa dans l'éditeur de lien :p:p;)
                      -lws2_32
                      Euh sinon...je pense (j'ai regardé vite fait la source) que sa peut marcher mais l'utilisateur ne verra rien d'écrire dans la console côté client et serveur...le client verra probablement : Appuyez sur une touche etc...enfin je n'ai pas testé pas trop le temps là et pour le serveur on ne verra rien^^.(A vérifié enfin mnt tu vas pouvoir nous dire vus que tu vas pouvoir compiler :p )
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 juin 2006 à 17:53:25

                        J'ai pu compiler.
                        Norton , mon antivirus me dis que serveur.c tente de se conecter a client.c mais j'a printf le buffer et rien :(

                        Je montre les nouveaux codes :

                        serveur :


                        #include <stdio.h>
                        #include <stdlib.h>
                        #include <winsock2.h>



                        int main(void)
                        {
                        WSADATA WSAdata;
                        SOCKET sock;
                        SOCKET csock;
                        sock=socket(AF_INET, SOCK_STREAM, 0);
                        SOCKADDR_IN sin;
                        SOCKADDR_IN csin;
                        sin.sin_addr.s_addr = INADDR_ANY;
                        sin.sin_family = AF_INET;
                        sin.sin_port = htons(6667);
                        bind(sock, (SOCKADDR *)&sin, sizeof(sin));
                        listen(sock, 0);
                        while(1)
                        {
                        int size=sizeof(csin);
                        csock=accept(sock, (SOCKADDR *)&sin, &size);
                        if(csock != INVALID_SOCKET) {
                        printf("un client se connecte !");
                        send(csock, "Hello world\r\n", 14, 0);
                        }
                        }
                        system("PAUSE");
                        return 0;
                        }


                        Client :

                        #include <stdio.h>
                        #include <stdlib.h>
                        #include <winsock2.h>


                        int main(void)
                        {
                        WSADATA WSAdata;
                        WSAStartup(MAKEWORD(2,0), &WSAdata);
                        SOCKET sock;
                        SOCKADDR_IN sin;
                        char buffer[255]="";
                        sin.sin_addr.s_addr = inet_addr("ip");
                        sin.sin_family = AF_INET;
                        sin.sin_port = htons(6667);
                        sock=socket(AF_INET, SOCK_STREAM, 0);
                        connect(sock, (SOCKADDR *)&sin, sizeof(sin));
                        recv(sock, buffer, sizeof(buffer), 0);
                        printf("Envoi de serveur : %s\n", buffer);
                        closesocket(sock);
                        WSACleanup();
                        system("PAUSE");
                        return 0;
                        }

                        Voila j'ai tout mis comme che zmoi sauf mon ip ^^

                        Comme vous voyez j'ai printf("%s", buffer); , buffer contenant le message de serveur !
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 juin 2006 à 18:49:03

                          Citation : lapras123


                          Voila j'ai tout mis comme che zmoi sauf mon ip ^^




                          #include <stdio.h>
                          #include <stdlib.h>
                          #include <winsock2.h>

                          #define PORT 6667

                          int main(void)
                          {
                             WSADATA WSAdata;
                             WSAStartup(MAKEWORD(2, 0), &WSAdata);
                             {
                                SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
                                SOCKADDR_IN sin;
                                sin.sin_addr.s_addr = INADDR_ANY;
                                sin.sin_family = AF_INET;
                                sin.sin_port = htons(PORT);
                                bind (sock, (SOCKADDR *)&sin, sizeof(sin));
                                listen (sock, 5);
                                printf ("listening port %d\n", PORT);
                                while (1)
                                {
                                   SOCKADDR_IN csin;
                                   int size = sizeof(csin);
                                   SOCKET csock = accept (sock, (SOCKADDR *) &sin, &size);
                                   if (csock != INVALID_SOCKET)
                                   {
                                      printf("un client se connecte !\n");
                                      char s[] = "Hello world\r\n";
                                      send(csock, s, strlen(s), 0);
                                   }
                                }
                             }
                             WSACleanup();
                             return 0;
                          }

                          Ce serveur fonctionne avec un client Telnet sur 127.0.0.1 6667.

                          Lancement du serveur


                          Console serveur :

                          listening port 6667

                          Lancement du client (Telnet).


                          Console Telnet :

                          Hello world


                          Console serveur :

                          listening port 6667
                          un client se connecte !

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Music only !
                            8 juin 2006 à 19:11:58

                            merci ! es ce que client peut faire un send(); a serveur ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              8 juin 2006 à 19:28:02

                              Citation : lapras123

                              merci ! es ce que client peut faire un send(); a serveur ?


                              Ben oui. Un client Telnet, c'est une console... Tu mets un recv() dans une boucle du serveur (pas 'la' boucle, OK ?), et tu vas recevoir ce qu'envoie la console Telnet...
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Music only !
                                8 juin 2006 à 19:30:50

                                Ouais mais mon send dans le client c'est ca ? :

                                send(sock, "coucou", 6, 0);


                                moi je pense que c'est faux :D

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  8 juin 2006 à 19:44:00

                                  Moi j'arrive pas à compiler sous code::blocks :'(
                                  Il me dit : cannot find -l-lws2_32
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    8 juin 2006 à 22:16:04

                                    Citation : lapras123

                                    Ouais mais mon send dans le client c'est ca ? :


                                    send(sock, "coucou", 6, 0);



                                    moi je pense que c'est faux :D


                                    Ce n'est pas faux, mais c'est inmaintenable...

                                    Je préfère
                                    char s[] = "coucou\n\r";
                                    send(sock, s, strlen(s), 0);

                                    Mais ce n'est que du protocole applicatif...


                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Music only !
                                      8 juin 2006 à 22:33:42

                                      Citation : alhanater

                                      Moi j'arrive pas à compiler sous code::blocks :'(
                                      Il me dit : cannot find -l-lws2_32



                                      Normalement tu as mis : -l-lws2_32 au lieu de sa -lws2_32 (tu as ajouté un -l^^)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        8 juin 2006 à 23:24:42

                                        en fait non, j'ai bien mis -lws2_32 mais à la compile, il me dit cannot find -l-lws2_32 o_0
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          8 juin 2006 à 23:48:24

                                          SI tu l'a mis dans les option du linker, retire le premier -l, ca devrait marcher.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            9 juin 2006 à 8:11:24

                                            Non :p
                                            Dans option du linker j'ai mis -lws2_32 mais à la compile y me dit cannot find -l-lws2_32 :
                                            Image utilisateur
                                            Mais ce que je ne comprend pas, c'est pourquoi, quand je change et que je met par exemple ws2_32 au lieu de -lws2_32 il me dit quand même la même erreur o_O
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              9 juin 2006 à 9:01:47

                                              Citation : alhanater


                                              Dans option du linker j'ai mis -lws2_32 mais à la compile y me dit cannot find -l-lws2_32 :


                                              C'est un peu bourrin, mais dans la liste des libraries, j'ai mis :
                                              C:\Program Files\CodeBlocks\lib\libws2_32.a

                                              A adapter selon ton installation, évidemment...

                                              Je crois que quand il y a un espace dans le nom d'un chemin, c'est la seule façon de s'en sortir...

                                              Sinon, en principe, pour installler /chemin/libxxx.a, il faut mettre xxx dans la liste des libraries et /chemin/ dans les directories du linker.


                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Music only !
                                                9 juin 2006 à 12:08:44

                                                Merci, maintenant ça marche avec tes conseils :)
                                                PS : Dans build > compiler options > linker j'ai dut retirer -lws2_32 (je me souviens pas avoir mis ça o_O )
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  9 juin 2006 à 13:30:32

                                                  Avec C::B je met "ws2_32" et ça marche bien :) .
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    9 juin 2006 à 16:24:15

                                                    J'ai résolu le probmleme merci :)
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Sockets

                                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                    • Editeur
                                                    • Markdown