tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
302
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Der Wolf Der Wolf ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    Hiho,
    ich hab vor kurzem angefangen mich ein wenig mit Netzwerkprogrammierung zu beschäftigen und hab mir daher mal die Tutorials auf der Seite von http://www.c-worker.ch/ angeschaut und sowohl den Server wie auch den Client von dort implementiert.
    Nun wollte ich das so abändern das ich nicht mit dem Server unter 127.0.0.1 verbinde. Der Server zu dem ich Kontakt aufnehmen will läuft zwar ebenfalls auf meinem Rechner, aber ich wollte ihn über einen hostnamen erreichen, den ich mir von dynDNS.org hab zuweisen lassen. Den Client hab ich so abgeändert das er aus der Adresse die IP auslesen kann und er bekommt auch die richtige mitgeteilt. Aber eine Verbindung kommt trotzdem nicht zu stande, obwohl der Server läuft und der Port auch freigegeben ist.
    Daraufhin hab ich versucht spasseshalber den Server per telnet zu erreichen. Über die IP 127.0.0.1 geht es ebenfalls, aber halt nicht über den hostnamen.

    Ich hänge mal den Servercode an. Ich hoffe ihr könnt mir mit dem Problem weiterhelfen.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    
    #pragma comment(lib, "ws2_32.lib"); 
     
    #include "Server.h"
    #include <winsock2.h>
    #include <windows.h>
    #include <stdio.h>
     
    Server::Server() {
    }
     
    Server::~Server() {
    }
     
    int Server::startWinsock() {
        
        WSADATA wsa;
        
        return WSAStartup(MAKEWORD(2,0), &wsa); 
    }
     
    int Server::startServer() {
        
        char buf[256];
        char buf2[300]; 
        long rc;
        
        SOCKET acceptSocket;
        SOCKADDR_IN addr;
                  
        FD_SET fdSet;
        SOCKET clients[10];
        
        // start winsock
        rc = startWinsock();
        if (rc != 0) {
            printf("Fehler: startWinsock Fehler Code: %d \n", rc);
            return 1;
        } else {
            printf("Winsock erfolgreich gestartet! \n");
        }
        
        // create sockets
        acceptSocket = socket(AF_INET, SOCK_STREAM, 0);
        if (acceptSocket == INVALID_SOCKET) {
            printf("Fehler: Socket konnte nicht erstellt werden: Code %d\n", WSAGetLastError());
            return 1;
        } else {
            printf("Socket erstellt! \n");
        }
        
        // bind acceptSocket
        memset(&addr, 0, sizeof(SOCKADDR_IN));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(3015);
        addr.sin_addr.s_addr = INADDR_ANY;
        rc = bind(acceptSocket, (SOCKADDR*) &addr, sizeof(SOCKADDR_IN));
        if (rc == SOCKET_ERROR) {
            printf("Fehler: Socket konnte nicht gebunden werden. Code: %d \n", WSAGetLastError());
            return 1;
        } else {
            printf("Socket gebunden. Port: 3015 \n");
        }
        
        //switch to listen mode
        rc = listen(acceptSocket, 10);
        if (rc == SOCKET_ERROR) {
            printf("Fehler: Listen, code: %d \n", WSAGetLastError());
            return 1;
        } else {
            printf("Warte auf eingehende Verbindung ... \n");
        }
        
        // initialise client sockets
        for (int i = 0; i < 10; i++) {
            clients[i] = INVALID_SOCKET;
        }
        
        while (1) {
            FD_ZERO(&fdSet);
            FD_SET(acceptSocket, &fdSet);
            
            for (int i = 0; i < 10; i++) {
                if (clients[i] != INVALID_SOCKET) {
                    FD_SET(clients[i], &fdSet);
                }
            }
            
            rc = select(0, &fdSet, NULL, NULL, NULL);
            if (rc == SOCKET_ERROR) {
                printf("Fehler: Beim select(). Code: %d \n", WSAGetLastError());
                return 1;
            } 
            
            // test if new connection request is incomming
            if (FD_ISSET(acceptSocket, &fdSet)) {
                for (int i = 0; i < 10; i++) {
                    if (clients[i] == INVALID_SOCKET) {
                        clients[i] = accept(acceptSocket, NULL, NULL);
                        printf("Neue Verbindung angenommen (%d) \n", i);
                        break;
                    }
                }           
            }
            
            for (int i = 0; i < 10; i++) {          
                if (FD_ISSET(clients[i], &fdSet)) {
                    rc = recv(clients[i], buf, 256, 0);
                    if (rc == 0 || rc == SOCKET_ERROR) {
                        printf("Client %d hat die Verbindung geschlossen! \n", i);
                        closesocket(clients[i]);
                        clients[i] = INVALID_SOCKET;
                    } else {
                        buf[rc] = '\0';
                        printf("Client %d hat folgendes gesandt: %s \n", i, rc);
                        sprintf(buf2, "Danke! \n");
                        send(clients[i], buf2, (int) strlen(buf2), 0);
                    }
                }           
            }
        }
    }

    Ach ja. Ich bin auch für alle anderen Anregungen dankbar. Ziel ist für mich im Moment soviel über Netzwerkprogrammierung zu lernen wie ich nur kann. Ich wollte mir aus Spass an der Freude ein kleines Spiel zusammenbasteln, das vllt auch mal über Internet zu spielen sein soll (ist zwar alles Zukunftsmusik, aber ein Mensch muss ja träumen können ). Also nur keine Scheu.

    Gruss
    Der Wolf
     

  2. #2
    Teambeta Teambeta ist offline Mitglied Gold
    Registriert seit
    Apr 2004
    Beiträge
    207
    Hast du den Port auch, von deinem Router auf deine interne Addresse, weiterleiten lassen?
     

  3. #3
    Der Wolf Der Wolf ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    Ich hab mir in meinem Gigaset Router unter NAT -> Virtueller Server den Port weiterleiten lassen, ja. Eigentlich hatte ich gedacht das müsste reichen.
     

  4. #4
    Teambeta Teambeta ist offline Mitglied Gold
    Registriert seit
    Apr 2004
    Beiträge
    207
    Intern gehts aber, oder?

    Sendet dein Router( oder per Programm ) auch regelmäßig eine neue IP an den
    Server?

    Hast du schon über deinen Freund probiert, mit der normalen Ausgangs IP deinen Server anzusprechen?
     

  5. #5
    Der Wolf Der Wolf ist offline Mitglied Gold
    Registriert seit
    Aug 2007
    Beiträge
    158
    Ahhh. Problem gelöst.

    Das lag alles nicht am Code. Was ich versucht hatte nennt sich wohl NAT-Loopback, oder so ähnlich. Also von meinem Rechner aus ins Netz und über die öffentliche IP wieder zurück auf meinen Rechner und das beherrscht mein Router nicht. Daher hat das alles nicht funktioniert.
    Den Client mal von meinem Kumpel auf seinem Rechner, etwa 5km entfernt starten lassen und alles funktioniert. Vielen Dank für eure Bemühungen.

    Gruss
    Der Wolf
     

Ähnliche Themen

  1. Gaim 1.5 Verbindungsprobleme
    Von JFHunter im Forum Internetkommunikation
    Antworten: 0
    Letzter Beitrag: 21.06.06, 16:24
  2. Verbindungsprobleme
    Von am0n im Forum Internet, DSL & Flatrate
    Antworten: 3
    Letzter Beitrag: 13.06.05, 02:20
  3. wlan - Verbindungsprobleme
    Von danielneunundsiebzig im Forum Netzwerke
    Antworten: 8
    Letzter Beitrag: 14.03.05, 17:18
  4. DSL Verbindungsprobleme
    Von Florian Schulz im Forum Internet, DSL & Flatrate
    Antworten: 3
    Letzter Beitrag: 15.10.04, 19:21