Sockets reden nicht miteinander



  • Hallo zusammen.
    Ich bin dabei eine Socketverbindung zwischen Client und Server zu programmieren.
    Mein Problem ist, dass die beiden nicht miteinander reden.
    Vielleicht könnt ihr mir helfen:

    Mein Client:

    int main( int argc, char* argv[])
    {
    
      while(2){
         dgSocket m_dgSocket("127.0.0.1", 3011);
         m_dgSocket.connect("127.0.0.1", 3011);
         if(!m_dgSocket.IsConnected())
             cout<<"Fehler bei Verbindung"<<endl;
         else
             cout<<"ist verbunden"<<endl;
        }
       cvvWaitKey(0);
    	return 0;
    }
    

    Mein Server:

    int main( int argc, char* argv[])
    {
      while (1){
    
      dgSocket m_dgSocket(3011,true);
      m_dgSocket.listen(3011,false,100);
      if(!m_dgSocket.IsListening())
        cout<<"Fehler bei Server"<<endl;
      else 
        cout<<"is verbtunden"<<endl;
        cout<<"warten auf den Client..."<<endl;
        if (!m_dgSocket.isAcceptable())
         cout<<"Verbindung ist fehlgeschlagen"<<endl;
        else
         m_dgSocket.accept();
         cout<<"Client verbunden"<<endl;
      }
    
       cvvWaitKey(0);
    	return 0;
    }
    

    Starte ich den Server gibt er mir alle meine Ausgaben hintereinander aus.
    Was ist da falsch?

    Vielen Dank
    EvA



  • Erstmal sollte der Client auch etwas schicken, was der Server empfangen könnte - der verbindet nur und verrät dir, ob's geklappt hat, dann beendet er sich.
    (btw ist das connect(..) nicht notwendig, wenn der Konstruktor bereits die Verbindung aufbaut)

    Zweitens muß der Server auch etwas empfangen, NACHDEM er sich mit dem Client zusammengeschlossen hat - welche Methode ist denn für die Server-Seite des Verbindungsaufbaus zuständig?

    PS: für die Lösung deiner Probleme ist es hilfreicher, den Inhalt der Socket-Methoden zu kennen.



  • Ich habe jetz versucht etwas zu schicken, aber es gibt eine Fehlermeldung:

    dgSocket m_dgSocket("127.0.0.1", 3011);
         m_dgSocket.connect("127.0.0.1", 3011);
         if(!m_dgSocket.IsConnected())
             cout<<"Fehler bei Verbindung"<<endl;
         else
             while(3){cout<<"ist verbunden"<<endl;
             m_dgSocket.write("test",2);
    
        }
    
    error C2664: 'dgSocket::write' : cannot convert parameter 1 from 'const char [5]' to 'const unsigned char *'
    

    write ist folgendermaßen definiert:

    virtual int write(const unsigned char* pChars,int nNumber);

    Thanx



  • Das Problem ist: char = signed char bei deinem Compiler - deshalb haben String-Literale den Typ "signed char*". Also entweder du änderst die write-Funktion auf "write(const char* pChars,int nNmuber);", dann kann der Parameter zugeordnet werden, oder du suchst in der Dokumentation des Compilers heraus, wie man char umstellt auf unsigned.



  • Kalua vllt. erstmal Grundlagen lernen bevor du dich an Sockets wagst.



  • ok... ich muss den Compiler umstellen.

    Laut Handbuch geht das mit /J (Compiler Options). Leider kann ich damit garnichts anfangen.



  • Wie Any schon sagte: Grundlagen

    Es fehlen einige Klammern.



  • ich habe jetz die Klammern gesetzt. Und richtig: Grundlagen fehlen, aber wie sagt man so schön: Learning by doing. Vielleicht könnt ihr mir trotzdem helfem. Ist doch bestimmt ein klacks für euch 😉

    int main( int argc, char* argv[])
    {
      while (1){
    
          dgSocket m_dgSocket(3011,true);
          m_dgSocket.listen(3011,false,100);
          if(!m_dgSocket.IsListening()){
            cout<<"Fehler bei Server"<<endl;}
          else 
          {cout<<"is verbtunden"<<endl;
             cout<<"warten auf den Client..."<<endl;
             if (!m_dgSocket.isAcceptable()){
                cout<<"Verbindung ist fehlgeschlagen"<<endl;
             else {
                m_dgSocket.accept();
                cout<<"Client verbunden"<<endl;}}}
        }
    
       cvvWaitKey(0);
    	return 0;
    }
    

    Client:

    int main( int argc, char* argv[])
    {
         dgSocket m_dgSocket("127.0.0.1", 3011);
        // m_dgSocket.connect("127.0.0.1", 3011);
         if(!m_dgSocket.IsConnected())
             cout<<"Fehler bei Verbindung"<<endl;
         else
         if(3){
               cout<<"ist verbunden"<<endl;
               m_dgSocket.write("test",2);}
    
       cvvWaitKey(0);
    	return 0;
    }
    

    Wäre supi !!!



  • CStoll (off) schrieb:

    Das Problem ist: char = signed char bei deinem Compiler - deshalb haben String-Literale den Typ "signed char*". Also entweder du änderst die write-Funktion auf "write(const char* pChars,int nNmuber);", dann kann der Parameter zugeordnet werden, oder du suchst in der Dokumentation des Compilers heraus, wie man char umstellt auf unsigned.

    Warum nicht einfach ein cast benutzen?

    m_dgSocket.write(reinterpret_cast<unsigned char *>("test"),2);
    

    @kalua31
    Was ist denn dgSocket für eine Klasse?

    mfg.



  • dgSocket

    class dgSocket
    {
    
    public:
    	enum sockstate_type { LISTENING, ACCEPTED, CONNECTED, INVALID };
    
    	dgSocket();
    	bool IsConnected() { return (m_SocketState == CONNECTED ||  m_SocketState == ACCEPTED); };
    	bool IsListening() { return (m_SocketState == LISTENING); };
    //Client
    	dgSocket(const char* pIpAddress, int nPort);
    
    	//Server
    	dgSocket(int nPort, bool bLocal = false);
    
    	/// destructor
    	virtual ~dgSocket();
    
    	bool connect(const char* pIpAddress,int nPort);
    
    	bool listen(int nPortA, bool bLocal = false, int nBacklogA = 100);
    
    	dgSocket* accept();
    
    	virtual int write(const unsigned char* pChars,int nNumber);
    

    USW



  • Und die Implementierungen oder eine Doku? Woher hast du diese Klasse? Selber gemacht?

    Naja, mit dem reinterpret_cast sollte es eigentlich gehen, schon ausprobiert?

    Achja, ich glaube beim zweiten parameter musst du die länge des Strings übergeben, das wäre bei "test" dann 5.

    mfg.



  • hmmm es funktioniert immernoch nicht. jetz geht die Shell auf und direkt wieder zu... wo liegt denn der Fehler?



  • kalua31 schrieb:

    hmmm es funktioniert immernoch nicht. jetz geht die Shell auf und direkt wieder zu... wo liegt denn der Fehler?

    Dann ist ein Fehler aufgetreten. Machst du beim Server auch recv()?

    mfg.



  • ich kann nur read und write machen

    Er sagt aber socket is not connected und das in Endlos !



  • kalua31 schrieb:

    ich kann nur read und write machen

    Er sagt aber socket is not connected und das in Endlos !

    Dann liegt das Problem schon beim verbinden. Wie gesagt: Schick mal die Implementierung oder ne DOku der Klasse rüber.

    mfg.



  • ich habe ja keine doku. kann dir nur schicken, was ich vorhin schon gepostet hab
    sorry



  • kalua31 schrieb:

    ich habe ja keine doku. kann dir nur schicken, was ich vorhin schon gepostet hab
    sorry

    Und woher kennst du die Klasse?

    mfg.


Anmelden zum Antworten