Verbindungsprobleme

Der Wolf

Erfahrenes Mitglied
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:
#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
 
Ich hab mir in meinem Gigaset Router unter NAT -> Virtueller Server den Port weiterleiten lassen, ja. Eigentlich hatte ich gedacht das müsste reichen.
 
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?
 
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
 
Zurück