2017-08-16 12 views
-19

私は別のコンピュータから自分のPCに公開しようとしていますが、接続機能からエラーコード10060を返します。公開鍵に接続するWinsockプログラミング

私がinet_addr("127.0.0.1")のローカルマシン からサーバに接続し、クライアントと接続すると動作します。

私は下の同じクライアントコードでサーバーのパブリックIPに接続しようとしましたが、それは返す10060誰でも助けることができますか?

サーバー

#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; 
} 

これは、問題は、サーバーにあるクライアント

#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

クライアントを実行しているマシンからパブリックIPにpingすることはできますか?そうであれば、サーバがlistenするルータのポートがルータ設定で転送されているかどうか確認する必要があります。 – Pras

+0

'server.sin_addr.s_addr = inet_addr 0.1 ")。 - > server.sin_addr.s_addr = inet_addr( "0.0.0.0");これにより、すべてのインターフェイスでバインドされます。 –

+1

注:サーバーは各接続で 'newSocket'をリークします。 –

答えて

15

です。あなたは127.0.0.1にバインドしています。つまり、サーバーはループバックインターフェイスにのみバインドされるため、サーバーと同じマシンで実行されているクライアントだけがこの同じインターフェイスを使用してサーバーに接続できます。

、あなたのサーバがパブリック・ネットワーク・インタフェースからクライアントを受け入れるようにしたい場合は、代わりにそのインターフェイスのIPにバインドする必要があります。

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

それとも、あなたが利用可能なすべてのネットワークインターフェイスにサーバーをバインドすることができた:

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

または:あなただけのIPにバインドすることができます

server.sin_addr.s_addr = INADDR_ANY; 

注(S)サーバーが稼働しているマシンに属しています。クライアントが接続しようとしているパブリックIPがNAT /ルーターに属している場合は、NAT /ルーターに接続されているローカルLAN IPにサーバーをバインドし、NAT /ルーターにポートフォワーディングを設定して転送する必要がありますNAT /ルータのパブリックIP上のオープンポートからサーバのLAN IP上のリスニングポートへのパケット。 NAT /ルーターがuPNPをサポートしている場合、サーバーはプログラマブルにポート転送をセットアップできます。それ以外の場合は、NAT /ルーターの管理者が手動で転送を設定する必要があります。

+0

"または、使用可能なすべてのネットワークインターフェイスにサーバーをバインドすることができます" - GOLD!早くからこの情報を知りたいと思っています。多くのありがとうございます。 :) – enhzflep

+0

@enhzflepは私が手に入れていないいくつかの皮肉ですか? –

+2

いいえ、それは私のupvoteと一緒に行くコメントです。私は前に0.0.0.0に縛られることは決して知られておらず、驚いて学びました。 :) – enhzflep