Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C/Socket] Erreur de socket

La fonction socket() retourne toujours -1

Sujet résolu
    2 novembre 2006 à 18:51:44

    Bonjour :) ,
    J'essaie de programmer un programme pour discuter entre 2 PC (le mien étant le serveur). Pour ce, j'utilise les sockets, seulement comme dans le titre, il y a un problème.
    La fonction socket pour générer le descripteur de socket retourne toujours la variable -1 soit la variable synonyme d'erreur. Comment régler ce problème??
    Merci d'avance pour vos réponses.
    • Partager sur Facebook
    • Partager sur Twitter
      2 novembre 2006 à 18:56:06

      Salut,
      donne nous le debut du code (jusqu'a la création du socket) sinon on pourra pas faire grand chose.
      A+
      • Partager sur Facebook
      • Partager sur Twitter
        2 novembre 2006 à 18:58:58

        Re
        Voici le début du code :


        #include <stdio.h>
        #include <stdlib.h>
        #include <sys/types.h>
        #include <winsock2.h>
        #include <string.h>
        #define PORT 23

        /********* PROGRAMME SERVEUR (SOCKETS) ***********/
        /*************************************************/

        int zero(void *var, int var_size);

        int main(int argc, char *argv[])
        {
            int sock = 0;
            SOCKADDR_IN sock_addr;
            sock_addr.sin_addr.s_addr = htonl(INADDR_ANY);//initialisation de la struct SOCKADDR_IN
            sock_addr.sin_family = AF_INET;
            sock_addr.sin_port = htons(PORT);//port en NBO
            zero(&(sock_addr.sin_zero), sizeof(sock_addr.sin_zero));//met a zero le reste de la structure

            if((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)//création du socket ac test derreur
            {
                printf("ERREUR!!!\n");
                return EXIT_FAILURE;
            }
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          2 novembre 2006 à 19:02:41

          A tu initialiser Winsock quelque part avant ?
          Si non c'est normal que ca plante .

          Edit :
          Le code d'initialisation

          WSADATA WSAData;
          WSAStartup(MAKEWORD(2,0), &WSAData);
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            2 novembre 2006 à 19:03:54

            Normalement tu dois avoir quelque chose comme ça...
            (code réduit au minimum, aucune gestion d'erreurs...)


            #include <iostream>
            #include <cstring>
            #include "winsock2.h"

            using namespace std;

            int main(){
                WSADATA WSAData;
                WSAStartup(MAKEWORD(2,2),&WSAData);
                sockaddr_in serverAddress;
                serverAddress.sin_family=AF_INET;
                serverAddress.sin_port=htons(12345);
                serverAddress.sin_addr.s_addr=htons(INADDR_ANY);
                memset(&serverAddress.sin_zero,0,8);
                int sock=socket(PF_INET,SOCK_STREAM,0);
                bind(sock,(sockaddr*)&serverAddress,sizeof(sockaddr_in));
                listen(sock,5);
                int clientAddressLength=sizeof(sockaddr_in);
                sockaddr_in clientAddress;
                cout<<"En attente de connexions..."<<endl;
                int newSock=accept(sock,(sockaddr*)&clientAddress,&clientAddressLength);
                cout<<"Connexion d'un client d'addresse "<<inet_ntoa(clientAddress.sin_addr)<<" sur le port "<<ntohs(clientAddress.sin_port)<<"."<<endl;
                FILE* outputStream=fdopen(newSock,"wt");
                FILE* inputStream=fdopen(newSock,"rt");
                // Ici communication possible avec le client...
                fclose(outputStream);
                fclose(inputStream);
                closesocket(newSock);
                WSACleanup();
                return EXIT_SUCCESS;
            }

            • Partager sur Facebook
            • Partager sur Twitter
              2 novembre 2006 à 19:05:28

              Exact :)
              Et <sys/types.h> c'est pour Linux ;)
              • Partager sur Facebook
              • Partager sur Twitter
                2 novembre 2006 à 19:06:24

                Effectivement, j'ai oublié tout ce qui concerne WSAData, c'est bon j'ai corrigé.
                Scusez pour le dérangement car l'erreur était vraiment bête :euh: .
                Merci de me l'avoir signalé :) .
                • Partager sur Facebook
                • Partager sur Twitter
                  2 novembre 2006 à 19:36:20

                      FILE* outputStream=fdopen(newSock,"wt");
                      FILE* inputStream=fdopen(newSock,"rt");
                      // Ici communication possible avec le client...
                      fclose(outputStream);
                      fclose(inputStream);


                  Très intéressant, explique comment ça marche stp :D
                  J'avais déjà vu un truc semblable en Perl mais en C o_O ...
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    2 novembre 2006 à 22:29:44

                    le code qu'il donne est en C++ mais ça m' étone aussi.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 novembre 2006 à 12:08:04

                      Citation : Davidbrcz

                      le code qu'il donne est en C++ mais ça m' étone aussi.



                      Le code, mouais.
                      Mais le type FILE et la fonction fclose() c'est du C :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        3 novembre 2006 à 13:06:27

                        Je compile toujours en C++, même pour des petits programmes très "style C", l'adaptation en C est en générale évidente.
                        Pour le code que j'ai donné, il ouvre simplement un flux en lecture et un autre en écriture sur la socket, ce qui fait que par la suite on peut utiliser toutes les bonnes vieilles fonctions de la libC pour communiquer entre programmes, et pas les fonctions d'entrées/sorties bas niveau recv/send/etc... a préférer définitivement !
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 novembre 2006 à 13:44:48

                          Citation : simon.arvaux

                          Je compile toujours en C++, même pour des petits programmes très "style C", l'adaptation en C est en générale évidente.


                          Je connais l'histoire du "Use C++ as a better C". Moi aussi, j'y ai cru pendant un moment, mais en réalité, c'est une fausse bonne idée. Le C et le C++ sont des langages différents et C++98 et C99 encore plus.

                          Je serais toi, j'ajouterais ceci dans mes sources C (.c) afin d'éviter toute tentation...

                          #ifdef __cplusplus
                          #error This source file is not C++ but rather C. Please use a C-compiler
                          #endif

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Music only !
                          Anonyme
                            3 novembre 2006 à 14:07:16

                            Je me suis mal exprimé, j'aurais du dire, "je programme toujours en C++", c'est à dire que je n'essaye jamais de compiler du C en C++, mais il m'arrive d'écrire en C++ du code qui aurait pu l'être en C, typiquement dans cet exemple, si le lecteur veut le passer en C, il n'aura qu'a remplacer cout par printf, etc...
                            => Je n'ai aucun source C dans mes projets.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            [C/Socket] Erreur de socket

                            × 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