Socket baut keine Verbindung auf, Bildübertragung



  • Hallo bin noch ein völliger Neuling in C.

    Bin dabei eine Datei von einem PC auf einen anderen PC zu übertragen, jetzt habe ich das Problem das die Verbindung immer fehlschlägt, ich wieß nicht ob der Code so funktionieren kann, aber ich wäre euch sehr dankbar wenn ihr mir helfen könntet.

    Hier der Code vom PC1 (von dem die Bilddatei übertragen werden soll):

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    int main()
    {
    
        int Socket;
        int Laenge;
        int Verbindung;
        struct sockaddr_in Adressinfo;
        int len;
        char* buffer[1024];
        int fLength = 0;
        int Port = 80;
        char Ip_Adresse[80]={"192.168.2.31"};//Ip des c-programmieren.com Servers
        FILE * file = NULL;
    
        WSADATA wsaData;
        if(WSAStartup(MAKEWORD(1,1), &wsaData) != 0)
        {
        printf("WSA konnte nicht initialisiert werden.\n\n");
        system("PAUSE");
        return 0;
        }
    
        Socket = socket(AF_INET, SOCK_STREAM, 0);
        Adressinfo.sin_family = AF_INET;
        Adressinfo.sin_addr.s_addr = inet_addr(Ip_Adresse);
        Adressinfo.sin_port = htons(Port);
        Laenge = sizeof(Adressinfo);
    
        Verbindung = connect(Socket, (struct sockaddr *)&Adressinfo, Laenge);
        if (Verbindung == 0)
        {
        printf("Verbindungsaufbau erfolgreich!");
        }
        else
        {
        printf("Verbindungsaufbau ist fehlgeschlagen!");
        }
    
        if ((file = fopen("test.JPG", "rb")) == NULL)
        {
    
        printf("No file \n");
    
        return 1;
    
        }
    
        //fd= fopen( "bild.png", "r"); 
        while(!feof(file))
        {
           len= read(file, buffer, 1024);
           send(Socket, *buffer, len,0);
        }
    
        while(Verbindung!=SOCKET_ERROR)
        {
            bind(Socket,(struct sockaddr *)&Adressinfo, Laenge);                               
        }
        close(Socket);
        WSACleanup();
        fclose(file);
        system("pause");
        return 0;
    }
    

    Und hier der Code des PC2 (Empfänger PC des Bildes):

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <errno.h>
    int main()
    {
    
        int Socket;
        int Laenge;
        int Verbindung;
        struct sockaddr_in Adressinfo;
        char * buff = NULL;
        int len;
        char* antwort[1024];
        int fLength = 0;
        int Port = 80;
        char Ip_Adresse[80]={"192.168.2.37"};//Ip des c-programmieren.com Servers
        FILE * file = NULL;
    
        WSADATA wsaData;
        if(WSAStartup(MAKEWORD(1,1), &wsaData) != 0)
        {
        printf("WSA konnte nicht initialisiert werden.\n\n");
        system("PAUSE");
        return 0;
        }
    
        Socket = socket(AF_INET, SOCK_STREAM, 0);
        Adressinfo.sin_family = AF_INET;
        Adressinfo.sin_addr.s_addr = inet_addr(Ip_Adresse);
        Adressinfo.sin_port = htons(Port);
        Laenge = sizeof(Adressinfo);
    
        Verbindung = connect(Socket, (struct sockaddr *)&Adressinfo, Laenge);
        if (Verbindung == 0)
        {
        printf("Verbindungsaufbau erfolgreich!");
        }
        else
        {
        printf("Verbindungsaufbau ist fehlgeschlagen!");
        }
    
        if ((file = fopen("test2.JPG", "w+wb")) == NULL)
        {
    
        printf("No file \n");
    
        return 1;
    
        }
    
        while(Verbindung!=SOCKET_ERROR)
        {
        bind(Socket, (struct sockaddr *)&Adressinfo, Laenge);
        Verbindung=recv(Socket,*antwort,sizeof(*antwort),0);
        fwrite(*antwort,sizeof(*antwort),1,file);
    
        if(Verbindung==0)
        {
        printf("Server hat die Verbindung getrennt..\n");
        break;
        }
        if(Verbindung==SOCKET_ERROR)
        {
        printf("Fehler bei Empfangen: %d\n",WSAGetLastError());
        break;
        }
        antwort[Verbindung]='\0';
        printf("\nAntwort:\n\n Senden zu ENDE!!\n\n\n");
        }
    
        close(Socket);
        WSACleanup();
        fclose(file);
        system("pause");
        return 0;
        /*
        int len; char* buffer[1024]; fd= fopen( "bild.png", "r"); while(!feof(fd)){ len= read(fd, buffer, 1024); send(socketfd, buffer, len,NULL); }
        */
    }
    

    Gruß Marco



  • Wo ist denn das Problem genau? Ich bin gerade zu faul, das Ding selbst auf mögliche Fehler zu durchsuchen. Ich kann dir aber einen Link zu einer allgemeinen Erklärung geben:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-169861.html



  • Ja das Problem ist das die Verbindung immer fehlschlägt und ich nicht weiß wieso.

    Gruß Marco



  • Geht's nach 127.0.0.1? Das wäre der lokale Rechner. Ist der 80er Port auf beiden offen?



  • Hab kurz drübergesehen. Mein Verdacht ist, dass du nicht sicher bist, welcher der Client, und welcher der Server sein soll. In beiden Programmen machst du ein connect() , aber das sollte nur der Client machen. Der Server sollte bind(), [c]listen() und accept() machen. Im Zweifel nachlesen, das ist mir zuviel, um das hier her zu schreiben.



  • Port 80 sollte ja eigentlich fast immer offen sein.

    achso ja brauche ich kein connect wenn ich die Datei dann versenden möchte? ich muss mich doch dann verbinden und dann erst senden oder nicht?

    ich möchte mithilfe der Datei auf meinem PC einen Befehl geben auf den 2. PC und dieser soll mir dann das Bild schicken.

    Gruß Marco



  • marcoz schrieb:

    achso ja brauche ich kein connect wenn ich die Datei dann versenden möchte? ich muss mich doch dann verbinden und dann erst senden oder nicht?

    der client macht 'connect', der server muss 'listen, bind und accept' machen.
    schau mal hier: http://www.tenouk.com/Winsock/Winsock2example2.html
    🙂



  • Also habe das jetzt mal ausprobiert, es kommt aber immer noch die Meldung das die Verbindung Fehlgeschlagen ist, also beide PCs sind im gleichen Wlan Netz.

    Hier nochmal die beiden abgeänderten Codes:

    PC1: (Sender des Bildes):

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    int main()
    {
    
        int Socket;
        int Laenge;
        int Verbindung;
        struct sockaddr_in Adressinfo;
        int len;
        char* buffer[1024];
        int fLength = 0;
        int Port = 80;
        char Ip_Adresse[80]={"192.168.2.31"};//Ip des c-programmieren.com Servers
        FILE * file = NULL;
    
        WSADATA wsaData;
        if(WSAStartup(MAKEWORD(1,1), &wsaData) != 0)
        {
        printf("WSA konnte nicht initialisiert werden.\n\n");
        system("PAUSE");
        return 0;
        }
    
        Socket = socket(AF_INET, SOCK_STREAM, 0);
        Adressinfo.sin_family = AF_INET;
        Adressinfo.sin_addr.s_addr = inet_addr(Ip_Adresse);
        Adressinfo.sin_port = htons(Port);
        Laenge = sizeof(Adressinfo);
    
        if (bind(Socket,(struct sockaddr *)&Adressinfo, Laenge) < 0)
        {
           printf("Verbindungsaufbau ist fehlgeschlagen!");
        }
        else
        {
            printf("Verbindungsaufbau erfolgreich!");
        }
    
        if( listen(Socket, 5 ) == -1 ) {
            printf("Listen schlägt fehl!!");
        }
        while (accept(Socket,NULL,NULL) == -1);
    
        if ((file = fopen("test.JPG", "rb")) == NULL)
        {
    
        printf("No file \n");
    
        return 1;
    
        }
    
        //fd= fopen( "bild.png", "r"); 
        while(!feof(file))
        {
           len= read(file, buffer, 1024);
           printf("Sende Bild...");
           send(Socket, *buffer, len,0);
        }
    
        while(Verbindung!=SOCKET_ERROR)
        {
    
        }
        close(Socket);
        WSACleanup();
        fclose(file);
        system("pause");
        return 0;
    }
    

    PC2: (Empfänger des Bildes)

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <errno.h>
    int main()
    {
    
        int Socket;
        int Laenge;
        int Verbindung;
        struct sockaddr_in Adressinfo;
        char * buff = NULL;
        int len;
        char* antwort[1024];
        int fLength = 0;
        int Port = 80;
        char Ip_Adresse[80]={"192.168.2.37"};//Ip des c-programmieren.com Servers
        FILE * file = NULL;
    
        WSADATA wsaData;
        if(WSAStartup(MAKEWORD(1,1), &wsaData) != 0)
        {
        printf("WSA konnte nicht initialisiert werden.\n\n");
        system("PAUSE");
        return 0;
        }
    
        Socket = socket(AF_INET, SOCK_STREAM, 0);
        Adressinfo.sin_family = AF_INET;
        Adressinfo.sin_addr.s_addr = inet_addr(Ip_Adresse);
        Adressinfo.sin_port = htons(Port);
        Laenge = sizeof(Adressinfo);
    
        Verbindung = connect(Socket, (struct sockaddr *)&Adressinfo, Laenge);
        if (Verbindung == 0)
        {
        printf("Verbindungsaufbau erfolgreich!");
        }
        else
        {
        printf("Verbindungsaufbau ist fehlgeschlagen!");
        }
    
        if ((file = fopen("test2.JPG", "w+wb")) == NULL)
        {
    
        printf("No file \n");
    
        return 1;
    
        }
    
        while(Verbindung!=SOCKET_ERROR)
        {
        bind(Socket, (struct sockaddr *)&Adressinfo, Laenge);
        Verbindung=recv(Socket,*antwort,sizeof(*antwort),0);
        fwrite(*antwort,sizeof(*antwort),1,file);
    
        if(Verbindung==0)
        {
        printf("Server hat die Verbindung getrennt..\n");
        break;
        }
        if(Verbindung==SOCKET_ERROR)
        {
        printf("Fehler bei Empfangen: %d\n",WSAGetLastError());
        break;
        }
        antwort[Verbindung]='\0';
        printf("\nAntwort:\n\n Senden zu ENDE!!\n\n\n");
        }
    
        close(Socket);
        WSACleanup();
        fclose(file);
        system("pause");
        return 0;
    
    }
    


  • - Hast du Client und den Server auch mal auf einer Maschine getestet?
    - Blockiert den Server evtl. eine Firewall?



  • keine Firewall vorhanden, somit auch nicht blockiert dadurch, was meinst du mit Maschine?

    so muss das doch auch gehen, fehlt da nicht noch was??

    Gruß Marco



  • Mit Maschine ist z.B. PC gemeint. Klappt denn die Verbindung auf einem PC?



  • marcoz schrieb:

    while (accept(Socket,NULL,NULL) == -1);

    ^^das geht so nicht. 'accept' wartet normalerweise auf eine verbindung und gibt dann einen socket zurück, über den du kommuniziern kannst. so z.b:

    int comm_sock = accept (...);  // wartet auf verbindung
    if (comm_sock == -1)
    {
       // irgendwas ging schief
    }
    else
    {
       // verbindung steht jetzt
       send (com_sock, ...);   // <-- socket benutzen
    }
    

    und; tutorial lesen, z.b. das: http://beej.us/guide/bgnet/
    🙂



  • ;fricky schrieb:

    marcoz schrieb:

    while (accept(Socket,NULL,NULL) == -1);

    ^^das geht so nicht. 'accept' wartet normalerweise auf eine verbindung und gibt dann einen socket zurück, über den du kommuniziern kannst. so z.b:

    int comm_sock = accept (...);  // wartet auf verbindung
    if (comm_sock == -1)
    {
       // irgendwas ging schief
    }
    else
    {
       // verbindung steht jetzt
       send (com_sock, ...);   // <-- socket benutzen
    }
    

    und; tutorial lesen, z.b. das: http://beej.us/guide/bgnet/
    🙂

    ok mache ich, aber eine Verbindung muss ja trotzdem aufgebaut werden können, aber es wird schon abgebrochen beim Aufbauen der Verbindung. An was kann das denn sonst noch liegen?

    Gruß Marco



  • marcoz schrieb:

    ok mache ich, aber eine Verbindung muss ja trotzdem aufgebaut werden können, aber es wird schon abgebrochen beim Aufbauen der Verbindung.

    was heisst beim aufbauen der verbindung?
    schiefgehen kann es trotzdem, auch wenn der code OK ist.

    marcoz schrieb:

    An was kann das denn sonst noch liegen?

    frag 'errno' ab (unter unixoiden systemen), unter windoof: WSAGetLastError()
    🙂



  • WSAGetLastError() gibt die Zahl 10049 zurück, kann damit nix anfangen, habt ihr eine Idee wieso die Verbindung immer fehlschlägt?

    Gruß Marco



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C 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.



  • marcoz schrieb:

    WSAGetLastError() gibt die Zahl 10049 zurück, kann damit nix anfangen, habt ihr eine Idee wieso die Verbindung immer fehlschlägt?
    Gruß Marco

    gibst du auf der konsole ein

    net helpmsg 10049
    


  • ich weiß was die Fehlermeldung bedeutet das Problem ist nur das ich nicht weiß wieso diese ip ungültig sein soll, habe es auch schon mit anderen Ports probiert, geht jedoch auch nicht.

    sonst noch jemand n Idee??

    muss dazu sagen das ich im gleichen Wlan Netz bin wie der andere PC und ich die internen IP Adressen verwende, geht das so überhaupt?

    Gruß Marco



  • Noch einmal: hast du Client/Server schon auf einem Rechner getestet?
    Dann wüßtest du schonmal, ob das Programm überhaupt funktioniert.
    Wenn ja, dann ist es nur noch ne Netzwerkfrage (Routerkonfiguration, etc)



  • Big Brother schrieb:

    Noch einmal: hast du Client/Server schon auf einem Rechner getestet?
    Dann wüßtest du schonmal, ob das Programm überhaupt funktioniert.
    Wenn ja, dann ist es nur noch ne Netzwerkfrage (Routerkonfiguration, etc)

    wie soll ich die Programme auf meinem Rechner testen? Ich muss das ja übers Netz machen.

    An was kann das denn liegen?

    Gruß Marco


Anmelden zum Antworten