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.
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 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