Problem mit Socket-Programmierung



  • Hallo ihr da ^^

    Ich hab hier einen Code für einen Clienten, wollte die ip vom User eingeben lassen aber irgendwie funktioniert das nicht...

    #include <windows.h>
    #include <winsock2.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>
    
    //Prototypen
    int startWinsock(void);
    
    int main()
    {
      long rc;
      SOCKET s;
      SOCKADDR_IN addr;
      char buf[256];
      std::string ip;
    
      std::cout<<"IP:\t";
      std::cin >> ip;
    
      const char* _ip = ip.c_str();
    
      // Winsock starten
      rc=startWinsock();
      if(rc!=0)
      {
        printf("Fehler: startWinsock, fehler code: %d\n",rc);
        return 1;
      }
      else
      {
        printf("Winsock gestartet!\n");
      }
    
      // Socket erstellen
      s=socket(AF_INET,SOCK_STREAM,0);
      if(s==INVALID_SOCKET)
      {
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Socket erstellt!\n");
      }
    
      // Verbinden
      memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
      addr.sin_family=AF_INET;
      addr.sin_port=htons(12345); // wir verwenden mal port 12345
      addr.sin_addr.s_addr=inet_addr(_ip); // zielrechner ist unser eigener
    
      rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
      if(rc==SOCKET_ERROR)
      {
        printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
        return 1;
      }
      else
      {
        printf("Verbunden mit server..\n");
      }
    
      // Daten austauschen
      while(rc!=SOCKET_ERROR)
      {
        printf("\nZeichenfolge eingeben [max 256]: ");
        gets(buf);
        send(s,buf,strlen(buf),0);
        rc=recv(s,buf,256,0);
        if(rc==0)
        {
          printf("Server hat die Verbindung getrennt..\n");
          break;
        }
        if(rc==SOCKET_ERROR)
        {
          printf("Fehler: recv, fehler code: %d\n",WSAGetLastError());
          break;
        }
        buf[rc]='\0';
        printf("\nServer antwortet: %s\n",buf);
      }
      closesocket(s);
      WSACleanup();
      return 0;
    }
    
    int startWinsock(void)
    {
      WSADATA wsa;
      return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    

    Also irgendwie funktioniert alles. Wird verbunden und so weiter aber wenn ich dann einen String eingebe der versendet werden soll dann geht das irgendwie nicht. Also ich kann gar nichts eingeben...

    Vielleicht wisst ihr ja mehr als ich 😉

    Danke schonmal!



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Nach der Eingabe der IP liegt noch ein Zeilenumbruch (\n) irgendwo im Buffer, der bei gets angenommen wird. Das du nichts eingeben kannst, wird daran liegen, dass der Client bereits beim recv ist und auf Empfang wartet.

    Lösung ist also, den Buffer vor dem gets zu löschen
    http://www.c-plusplus.net/forum/266899

    EDIT: du solltest dich auf eine Ein/Ausgabe-"Sprache" festlegen. Mal c++ mal c macht es recht unuebersichtlich 😃



  • BasicMan01 schrieb:

    EDIT: du solltest dich auf eine Ein/Ausgabe-"Sprache" festlegen. Mal c++ mal c macht es recht unuebersichtlich 😃

    Hast du dafür eine gute Erklärung ? 🙂

    Gruss Unbekannter



  • Erklärung: JAa tue ich eigentlich auch nicht habe bloß dieses mal einfach den größten Teil des Codes rein kopiert ^^
    Nichts falsches denken ich hab den Code gelesen und ich denke auch verstanden ^^

    Habe nun aber ein weiteres Problem... ich möchte gerne den String überprüfen und wenn er "\\quit" lautet das programm beenden aber irgendwie reagiert das Programm gar nicht oO

    ...
        printf("\nZeichenfolge eingeben [max 256]: ");
        gets(buf);
    
        if(buf == "\\quit")
        {
          std::cout<<"Beende Programm...";
          Sleep(2000);
          break;
        }
    
        send(s,buf,strlen(buf),0);
    ...
    


  • 1336 h@xx0r xD schrieb:

    BasicMan01 schrieb:

    EDIT: du solltest dich auf eine Ein/Ausgabe-"Sprache" festlegen. Mal c++ mal c macht es recht unuebersichtlich 😃

    Hast du dafür eine gute Erklärung ? 🙂

    Gruss Unbekannter

    was heißt gut 🙂 ... man spart sich ne include. Außerdem ist es einfach ne Stilfrage.

    @WildChild ...
    CStrings vergleicht man mit der Funktion "strcmp" 😉



  • Ouh.. Danke 😃
    Ich kenne die Funktion wohl hab mir aber nie Gedanken drüber gemacht wieso ich das nicht direkt vergleichen sollte ^^
    Naja nun weiß ichs besser.. Danke sehr 🙂



  • Ok... ich habe eine weitere Frage ^^

    Ich habe mir gedacht ich schreibe einen Clienten der IP's von xx.xx.xx.xx bis xx.xx.xx.xx anspricht von Port xx bis xx.
    Eigentlich müsste der Client nun ja immer eine Meldung von wegen Verbindungsfehler und Fehlercode usw ausgeben... komischerweiße kriege ich aber immer nur den Fehlercode 10060 zurück, welcher soweit ich weiß ein Ping-Timout ist.
    Wenn ich nun meine eigene IP angeben und sie beispielsweiße von port 20 bis 22 anspreche kommt bei Port 20 und 22 ein 10060 bei 21, welcher ja der FTP Port ist, kommt aber ein Verbindung eingegangen.. Ich habe da aber keinen Clienten am laufen wie kann das also sein?

    Also meine Fragen, nochmal in aller Kürze ^^
    Wieso kann ich bei meiner eigenen IP auf Port 21 verbinden und warum kommt bei allen anderen IP's und Ports ein Fehlercode 10060?

    Hier mein Code:

    #include <iostream>
    #include <string>
    #include <winsock.h>
    
    using namespace std;
    
    int  StartWinsock(void);
    void InitDesign(void);
    
    int main(int argc, char *argv[])
    {
    	InitDesign();
    	StartWinsock();
    
    	if(argc < 5)
    	{
    		cout<<"Using: " << argv[0] << " <begin IP> <end IP> <begin port> <end port>" << endl;
    		return 1;
    	}
    
    	SOCKET Socket;
    	SOCKADDR_IN addr;
    
    	ULONG begin, end, beginP, endP, curr, currP;
    
    	begin  = ntohl(inet_addr(argv[1]));
    	end    = ntohl(inet_addr(argv[2]));
    	beginP = ntohl(inet_addr(argv[3]));
    	endP   = ntohl(inet_addr(argv[4]));
    
    	if(end < begin)
    	{
    		curr  = begin;
    		begin = end;
    		end   = curr;
    	}
    	if(endP < beginP)
    	{
    		currP  = beginP;
    		beginP = endP;
    		endP   = currP;
    	}
    
    	for(curr = begin; curr <= end; curr++)
    	{
    	    Socket = socket(PF_INET, SOCK_STREAM, 0);
    
    		memset(&addr, 0, sizeof(SOCKADDR_IN));
    		addr.sin_addr.s_addr = htonl(curr);
    		addr.sin_family      = PF_INET;
    
    		cout<< inet_ntoa(addr.sin_addr) << endl;
    
    		for(currP = beginP; currP <= endP; currP++)
    		{
    			addr.sin_port        = htons(currP);
    
    			cout<< currP << "\r";
    
    			if(connect(Socket, (SOCKADDR*)&addr, sizeof(addr)) == SOCKET_ERROR)
    				cout<<"Fehler: connect auf port " << currP << " gescheitert, Fehlercode: " << WSAGetLastError() << endl;
    			else
    				cout<<"Verbindung eingegangen auf Port: " << currP << endl;
    		}
            closesocket(Socket);
    	}
    	WSACleanup();
    }
    
    int StartWinsock(void)
    {
    	WSADATA wsa;
    	return  WSAStartup(MAKEWORD(2, 0), &wsa);
    }
    
    void InitDesign(void)
    {
    	system("COLOR 0A");
    }
    

    Bitte bitte bitte helft mir!
    Sonst kann ich heute nicht mehr schlafen 😃



  • Hm.. Also eigentlich sollte der Port 21 bei nem Desktop Rechner nicht ansprechbar sein? 😃



  • So wie man sieht hast du no überhaupt keine Ahnung was du da machst. Geschwiegen von der Programmiersprache. Also lerne die Grundlagen bitte...



  • 10060 (WSAETIMEDOUT) ist "Connection timed out. A connection attempt failed because the connected party did not properly respond after a period of time, or the established connection failed because the connected host has failed to respond."

    Unter win7 könntest du via "resmon" nachschauen ob auf Port 21 irgendwas lauscht, ansonsten über "netstat"



  • lernemaletwas schrieb:

    So wie man sieht hast du no überhaupt keine Ahnung was du da machst. Geschwiegen von der Programmiersprache. Also lerne die Grundlagen bitte...

    Magst du mir auch erklären wo ich nun so gar keine ahnung von der Programiersprache hab?
    Und ansonsten mal ne nützliche Antwort da lassen und nicht so ein sinnloses Gelaber...



  • Danke geeky^^
    Aber wieso is das denn so? Da müsste doch eigentlich einfach keine Verbindung zutande kommen oder?
    Und zu dem Port 21 ich geh da eine Verbindung ein egal welche ip ich nun versuche... Kann es sein das das normal ist weil da irgendwie ein ftp Server hintersitzt oder so?



  • Also es ist definiv nicht normal dass man seinen Rechner über Port 21 ansprechen kann. Das ist schon komisch.. netstat mal getestet?^^

    Abgesehen davon brauchst du für die Ports kein "inet_addr", und du solltest den Socket schließen und neu öffnen wenn eine Verbindung eingegangen wurde 😉

    Und dass man die Startparameter geschickter bearbeiten kann sollte klar sein, nur ist das zum testen wohl egal.

    Auf unregs wie "lernemaletwas" brauchste gar nicht reagieren, das sind selber meist nicht so die allerkrassesten 😃



  • Ja netstat ist aber nichts.. Und das komische ist ja auch, egal welche IP's ich nehme auf Port 21 kann ich eine Verbindung eingehen?!
    Und wie meinst du das mit den Startparametern?


Anmelden zum Antworten