Partage
  • Partager sur Facebook
  • Partager sur Twitter

erreur avec des arguments de type SOCKET.

Sujet résolu
    3 novembre 2018 à 21:33:43

    Bonjour a tous, je suis débutant en C++ et j'essaye de créer un serveur multi-clients en C++.

    Le code du serveur :

    #include <iostream>
    #include <WinSock2.h>
    #include <fstream> 
    #include <string>
    #include <thread>
    #include <windows.h>
    #include <mutex>
    using namespace std;
    // -lws2_32
    void initializeNetwork();
    void script(SOCKET s, SOCKADDR_IN addr, int counter);
    void acceptConnections(SOCKET &s, SOCKADDR_IN &addr, SOCKET &sListen);
    class NETData{
    public:
    	string host(){
    		return _host;
    	}
    	int port(){
    		return _port;
    	}
    private:
    	string _host = "127.0.0.1";
    	int _port = 694;
    };
    int main(){
    	initializeNetwork();
    	return 0;
    }
    void initializeNetwork(){
    	NETData netData;
    	WSAData wsaData;
    	WORD DLLVersion = MAKEWORD(2, 1);
    	while(true){
    		if(WSAStartup(DLLVersion, &wsaData) != 0){
    			cout << "Winsock2 startup failed" << endl;
    			Sleep(2000);
    		}else{
    			break;
    		}
    	}
    	SOCKADDR_IN addr;
    	int addrlen = sizeof(addr);
    	addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    	addr.sin_port = htons(netData.port());
    	addr.sin_family = AF_INET;
    	SOCKET sListen = socket(AF_INET, SOCK_STREAM, 0);
    	bind(sListen, (SOCKADDR*)&addr, sizeof(addr));
    	listen(sListen, SOMAXCONN);
    	SOCKET s;
    	cout << "waiting for connections..." << endl;
    	acceptConnections(SOCKET s, SOCKADDR_IN addr, SOCKET sListen);
    }
    void acceptConnections(SOCKET &s, SOCKADDR_IN &addr, SOCKET &sListen){
    	int x = 0;
    	int addrlen = sizeof(addr);
    	while(true){
    		s = accept(sListen, (SOCKADDR*)&addr, &addrlen);
    		if (s==0){
    			cout << "failed to accept connections" << endl;
    		}else{
    			cout << "new connections accepted" << endl;
    			thread t1(script,s,addr,x);
    			t1.join();
    			x++;
    		}
    	}
    }
    void script(SOCKET &s, SOCKADDR_IN &addr, int counter){
    	char DATA[256];
    	recv(s,DATA,sizeof(DATA),0);
    	cout << "received from bot[" << counter << "] :" << DATA << endl;
    }	

    et exactement à cet endroit (l.51) :

    acceptConnections(SOCKET s, SOCKADDR_IN addr, SOCKET sListen);
    j'ai une erreur pour chaques arguments dans la fonction "acceptConnections" :
    • server.cpp:51:27: error: expected primary-expression before 's'
    • server.cpp:51:27: error: expected primary-expression before 'addr'
    • server.cpp:51:27: error: expected primary-expression before 'sListen'

    Je ne comprend pas trop, j'ai fais plusieurs recherche mais je ne trouve rien qui m'aide à résoudre mon problème.

    Je vous remercie d'avance pour vos réponses.

    (C'est la première fois que je pose une questions ici donc il est fort probable que j'ai édité n'importe comment ma question)

    • Partager sur Facebook
    • Partager sur Twitter

    Roses are red, violets are blue, Internet Explorer obsolete...

      3 novembre 2018 à 23:33:49

      Lu',

      quand on appelle une fonction, on ne passe pas le type de la variable en parametre, mais uniquement la variable elle-même.

      Soit c'est juste une petite erreur d'inattention, soit c'est un code (entier) que tu as CC-CV sans rien comprendre....par terrible

      -
      Edité par eugchriss 3 novembre 2018 à 23:34:36

      • Partager sur Facebook
      • Partager sur Twitter

      Eug

        4 novembre 2018 à 1:17:30

        Quand on commence à trafiquer avec le réseau, mieux vaut savoir exactement ce qu'on est en train de faire, ou bien avoir un énorme stock de cierges et une cathédrale pas trop loin (ça marche pas trop mais ça rassure ^^ ), parce qu'en matière de trucs ésotériques inexplicables, le réseau, c'est la quintessence. Un pingouin te bidouille un routeur à l'autre bout de l'univers, y a plus rien qui marche et tu vas passer des mois à chercher le mauvais bug qui existe (ou pas) dans ton code...
        • Partager sur Facebook
        • Partager sur Twitter
        Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
          4 novembre 2018 à 11:49:56

          eugchriss a écrit:

          Lu',

          quand on appelle une fonction, on ne passe pas le type de la variable en parametre, mais uniquement la variable elle-même.

          Soit c'est juste une petite erreur d'inattention, soit c'est un code (entier) que tu as CC-CV sans rien comprendre....par terrible

          -
          Edité par eugchriss il y a environ 12 heures


          D'accord merci beaucoup d'avoir pris ton temps pour me répondre :).  C'est stupide je ne sais même pas pourquoi j'ai fais cette erreur haha, je comprend donc pourquoi j'ai pas pu trouver d'aide. Bonne journée.

          int21h a écrit:

          Quand on commence à trafiquer avec le réseau, mieux vaut savoir exactement ce qu'on est en train de faire, ou bien avoir un énorme stock de cierges et une cathédrale pas trop loin (ça marche pas trop mais ça rassure ^^ ), parce qu'en matière de trucs ésotériques inexplicables, le réseau, c'est la quintessence. Un pingouin te bidouille un routeur à l'autre bout de l'univers, y a plus rien qui marche et tu vas passer des mois à chercher le mauvais bug qui existe (ou pas) dans ton code...


          Certes tu as raison, j'ai décidé de quitter mon tutoriel sur le réseau en C++ (alors que j'avais à peine visionné pendant 10minutes la 1er vidéo sur les 13) pour créer désespérément un truc tout seul mais bon j'ai appris ma leçon, C++ n'est pas mon ami haha. Bonne journée.

          -
          Edité par k.escanor 4 novembre 2018 à 11:56:21

          • Partager sur Facebook
          • Partager sur Twitter

          Roses are red, violets are blue, Internet Explorer obsolete...

            4 novembre 2018 à 12:22:35

            TU peux le faire en C++. Comme l'a dit int21h en substance, il te faudra être patient simplement.

            C'est tout à fait faisable

            • Partager sur Facebook
            • Partager sur Twitter
              5 novembre 2018 à 11:14:25

              Erreur classique de débutant en programmation réseau. Ta fonction script est complètement aléatoire. recv peut très bien lire qu'une partie du message actuellement en tampon du noyau. TCP est un flux.

              En utilisant boost.asio tu profitera de fonctions de la convivialité comme async_read_until.

              -
              Edité par markand 5 novembre 2018 à 11:14:50

              • Partager sur Facebook
              • Partager sur Twitter

              git is great because Linus did it, mercurial is better because he didn't.

              erreur avec des arguments de type 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