2017-08-16 2 views
-19

Ich versuche, eine Verbindung zu meinem PC öffentlich von einem anderen Computer und es gibt 10060 Fehlercode von der Connect-Funktion.Winsock Programmierung Verbindung zu einer öffentlichen IP

Wenn ich bind den Server mit inet_addr("127.0.0.1") von der lokalen Maschine und mit einem Client verbinden, damit es funktioniert.

Ich habe versucht, mit der öffentlichen IP des Servers mit dem gleichen Client-Code unten zu verbinden, gibt es 10060 kann jemand helfen?

Server

#include<winsock2.h> 

int main(){ 
    WSADATA ws; 
    SOCKET s, newSocket; 
    struct sockaddr_in server, client; 
    int c; 

    if(WSAStartup(MAKEWORD(2,2), &ws) != 0){ 
     puts("error wsastartup"); 
     printf("wsa error at %d", GetLastError()); 
    } 

    if((s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){ 

     printf("socket error at %d", GetLastError()); 
    } 

    server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    server.sin_port = htons(8888); 
    server.sin_family = AF_INET; 

    if(bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR){ 
     printf("socket error at %d", GetLastError()); 
    }else{ 
     puts("bind done"); 
    } 

    listen(s, 3); 
    puts("Waiting for incoming connections"); 

    c = sizeof(struct sockaddr_in); 

    char *message = "hello client i got ur message";  

    while((newSocket = accept(s, (struct sockaddr*) &client, &c)) != INVALID_SOCKET){ 
     puts("connection accepted"); 
     send(newSocket, message, strlen(message), 0); 
    } 

    if(newSocket == INVALID_SOCKET){ 
     printf("accept failed iwth the code %d", GetLastError()); 
     return 1; 
    } 

    getchar(); 

    closesocket(s); 
    WSACleanup(); 
    return 0; 
} 

dies ist der Client

#include <winsock2.h> 

int main(){ 

    WSADATA ws; 
    SOCKET s; 
    struct sockaddr_in server; 
    char *message = "hello this is a message"; 

    if(WSAStartup(MAKEWORD(2,2), &ws) != 0){ 
     printf("wsa error at %d", GetLastError()); 
    }else{ 
     puts("wsa done"); 
    } 

    if((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET){ 
     printf("invalid socket at %d", GetLastError()); 
    } 

    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    server.sin_port = htons(8888); 

    if(connect(s, (struct sockaddr*)&server, sizeof(server)) < 0){ 
     printf("connection err %d", GetLastError()); 
    }else{ 
     puts("connected"); 
    } 
    return 0; 
} 
+0

Können Sie über den Computer, auf dem Sie den Client ausführen, eine öffentliche IP - Adresse senden? Wenn ja, müssen Sie in der Routereinstellung – Pras

+0

'server.sin_addr.s_addr = inet_addr (" 127.0. 0,1 "); -> server.sin_addr.s_addr = inet_addr ("0.0.0.0"); 'Dadurch wird es an allen Schnittstellen gebunden. –

+1

Hinweis; Der Server gibt bei jeder Verbindung "newSocket" aus. –

Antwort

15

Das Problem mit dem Server ist. Sie binden es an 127.0.0.1. Dies bedeutet, dass Ihr Server nur an die Loopback-Schnittstelle bindet, sodass nur Clients, die auf demselben Computer wie der Server ausgeführt werden, über dieselbe Schnittstelle eine Verbindung zum Server herstellen können.

Wenn Sie Ihren Server wollen Kunden von einem öffentlichen Netzwerk-Schnittstelle zu übernehmen, müssen Sie stattdessen auf diese Schnittstelle IP binden:

server.sin_addr.s_addr = inet_addr("<IP belonging to the public interface>"); 

Oder Sie Ihren Server an alle verfügbaren Netzwerkschnittstellen binden können:

server.sin_addr.s_addr = inet_addr("0.0.0.0"); 

Oder:

server.sin_addr.s_addr = INADDR_ANY; 

Beachten Sie, dass Sie nur an IP binden können (s) die zu der Maschine gehören, auf der der Server läuft. Wenn die öffentliche IP-Adresse, mit der der Client eine Verbindung herstellen möchte, zu einem NAT/Router gehört, müssen Sie den Server an seine lokale LAN-IP binden, die mit dem NAT/Router verbunden ist, und anschließend die Portweiterleitung auf dem NAT/Router einrichten Pakete von einem offenen Port an der öffentlichen IP-Adresse des Routers/Routers zum Empfangsport auf der LAN-IP des Servers. Wenn der NAT/Router uPNP unterstützt, kann Ihr Server die Portweiterleitung programmierbar einrichten. Andernfalls muss der Administrator des NAT/Routers die Weiterleitung manuell einrichten.

+0

"Oder Sie können Ihren Server an alle verfügbaren Netzwerkschnittstellen binden" - GOLD! Ich wünschte, ich hätte diese Information früher gewusst, vielen Dank. :) – enhzflep

+0

@enhzflep ist das etwas Sarkasmus, den ich nicht bekomme? –

+2

nein, es ist der Kommentar, der mit meinem upvote einhergeht. Ich hatte nie gewusst, dass ich vorher an 0.0.0.0 binden konnte und war begeistert. :) – enhzflep

Verwandte Themen