winsock client server konstrukt übers internet
-
Wenn ich versuche meinen Server Socket an eine feste IP zu binden schlägt das immer fehl ...
SOCKADDR_IN addr; memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family = AF_INET; addr.sin_port = htons(port); //addr.sin_addr.s_addr = ADDR_ANY; addr.sin_addr.s_addr = inet_addr ("192.168.178.25"); bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));Das klappt nur bei Netzwerk internen Adressen oder Hostnamen.
Wenn ich nun meine Internet IP über z.B "wieistmeineip.de" rausfinde und diese dann eintrage wird der Socket nicht gebunden
Muss ich da anders vorgehen wenn ich einen Client Server Verbindung übers Internet herstellen möchte ?
-
Du musst dir einen Root Server kaufen! Und dein Server dort draufspielen mit der IP
-
SOCKET ListenSocket = INVALID_SOCKET; struct addrinfo *result = NULL, hints; int iResult; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; // Resolve the server address and port iResult = getaddrinfo(NULL, 5000/*Port*/, &hints, &result); if ( iResult != 0 ) { printf("getaddrinfo failed: %d\n", iResult); } // Create a SOCKET for connecting to server ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ListenSocket == INVALID_SOCKET) { printf("socket failed: %ld\n", WSAGetLastError()); } // Setup the TCP listening socket iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen); ...
-
Delta- schrieb:
Du musst dir einen Root Server kaufen! Und dein Server dort draufspielen mit der IP
Ist es also nicht möglich ein Chat Programm ohne Root Server zu programmieren ?
Belli schrieb:
SOCKET ListenSocket = INVALID_SOCKET; struct addrinfo *result = NULL, hints; int iResult; ZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; // Resolve the server address and port iResult = getaddrinfo(NULL, 5000/*Port*/, &hints, &result); if ( iResult != 0 ) { printf("getaddrinfo failed: %d\n", iResult); } // Create a SOCKET for connecting to server ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ListenSocket == INVALID_SOCKET) { printf("socket failed: %ld\n", WSAGetLastError()); } // Setup the TCP listening socket iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen); ...Ich habe den Code zu meinem hinzugefügt bzw. ersetzt aber es gibt immer Fehler bei dem binden

-
Das mit dem RootServer zeugs ist doch quatsch.
Was gibts für ein Fehler beim bind(..)?
Simon
-
Du willst deinen Server an eine eigene IP fest binden?! Wo gibt's denn sowas?

Du musst dir keinen Rootserver kaufen, das ist Quatsch, aber eine feste IP, die musst du von deinem Provider kaufen. IdR solltest du aber als sin_addr sowieiso INADDR_ANY benutzen.
-
Hier mal Code meines Clients:
#include <iostream> #include <windows.h> #include <winsock2.h> #include <string> using namespace std; int StartWinsock (); int ConnectToServer ( SOCKET s ); long GetAddr ( string hostnameOrIp, SOCKADDR_IN* addr ); int main() { long ret = StartWinsock(); SOCKET s; if ( ret != 0 ) cout << "Winsock konnte nicht gestartet werden, ERROR: " << ret << endl; else cout << "Winsock gestartet!" << endl; s = socket (AF_INET,SOCK_STREAM,0); if ( s == INVALID_SOCKET ) cout << "Socket konnte nicht erstellt werden, ERROR: " << WSAGetLastError () << endl; else cout << "Socket erstellt!" << endl; if ( ConnectToServer (s) == SOCKET_ERROR ) cout << "Connect gescheitert, ERROR: " << WSAGetLastError() << endl; else cout << "Verbunden" << endl; // datenaustausch char sBuffer[] = "ICH BIN DER CLIENT"; char rBuffer[256]; send (s,sBuffer,strlen(sBuffer),0); recv (s,rBuffer,256,0); cout << rBuffer << endl; cin.get(); closesocket (s); WSACleanup(); return 0; } int StartWinsock () { WSAData wsa; // ohne WSAStartup schlägt jede weitere winsock funktion fehl return WSAStartup (MAKEWORD(1,2),&wsa); } int ConnectToServer ( SOCKET s ) { SOCKADDR_IN addr; memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten // struct füllen addr.sin_family = AF_INET; addr.sin_port = htons(12345); // wir verwenden mal port 12345 //addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // zielrechner ist unser eigener if ( GetAddr ( "ich.no-ip.org"/*meine dynamische ip*/, &addr ) == SOCKET_ERROR ) cout << "Adresse konnte nicht aufgeloest werden" << endl; return connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); } long GetAddr ( string hostnameOrIp, SOCKADDR_IN* addr ) { long rc; unsigned long ip; HOSTENT* he; /* Parameter prüfen */ if( addr == NULL) return SOCKET_ERROR; /* eine IP in hostnameOrIp ? */ ip = inet_addr(hostnameOrIp.c_str()); /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */ if( ip != INADDR_NONE) { addr->sin_addr.s_addr = ip; return 0; } else { /* Hostname in hostnameOrIp auflösen */ he = gethostbyname(hostnameOrIp.c_str()); if( he == NULL ) { return SOCKET_ERROR; } else { /*die 4 Bytes der IP von he nach addr kopieren */ memcpy(&(addr->sin_addr),he->h_addr_list[0],4); } return 0; } }Und hier nun der Server Socket bind:
int BindSocket ( SOCKET s , u_short port ) { SOCKADDR_IN addr; memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = INADDR_ANY; return bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); }Wenn ich nun beide ausführe kommt nach einer Zeit der Fehler: WSAETIMEDOUT 10060
-
Ad aCTa schrieb:
Du willst deinen Server an eine eigene IP fest binden?! Wo gibt's denn sowas?

Das wird häufig gemacht um EIN bestimmtes Interface von mehreren Interfaces auszuwählen. Macht also durchaus Sinn.
Simon
-
Danke für alle Antworten.
Problem gelöst, der Port war nicht freigegeben :|
-
bujaaa schrieb:
Danke für alle Antworten.
Problem gelöst, der Port war nicht freigegeben :|Rofl Koffer
-
hey kannste mir den code mal per icq senden? schreib mir mal pls ne pm, dann schick ich dir meine icq nummer

vielen dank schon mal im voraus