Tidak dapat terhubung ke ip jarak jauh

Saya mencoba menghubungkan klien dengan server. Dengan alamat lokal (127.0.0.1) semuanya berfungsi dengan baik, tetapi ketika saya mencoba menggunakan alamat jarak jauh saya, tidak berhasil. Saya mencari benda ini di seluruh internet tetapi saya tidak dapat menemukan apa pun.

Sisi server:

bool start_server()
{
    int i = 1;
    if(WSAStartup(MAKEWORD(2,0),&WsaDat) != 0)
    {
         cout << "WSA error!" << endl;
         system("pause");
         return FALSE;
    }
    if ( LOBYTE( WsaDat.wVersion ) != 2 || HIBYTE( WsaDat.wVersion ) != 0 )
    {
      cout << "Bad version of winsocket" << endl;
      system("pause");
      WSACleanup();
      return 0;
    }



    serwer = socket(AF_INET, SOCK_STREAM, 0);
    if(serwer == INVALID_SOCKET)
    {
        cout << "Can't create socketa!" << endl;
        system("pause");
        WSACleanup();
        return 0;
    }
    int port;
    cout << "Port input " << endl;
    cin >> port;                                             // 13056
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port =  htons(port);
    SockAddr.sin_family = AF_INET;
    SockAddr.sin_addr.s_addr = INADDR_ANY;
    setsockopt( serwer, SOL_SOCKET, SO_REUSEADDR, ( char * ) &i, sizeof ( i ) );
    if(bind(serwer,(SOCKADDR *)(&SockAddr), sizeof(SockAddr)) == SOCKET_ERROR)
    {
        cout << "Couldn't bind socket" << endl;
        system("pause");
        WSACleanup();
        return 0;
    }
    for(int i = 0; i < MAX_CLIENTS; i++)
    client[i].connected = FALSE;
    if(listen(serwer,SOMAXCONN)==SOCKET_ERROR)
    {
        cout << "Listening error!" << endl;
        system("pause");
        WSACleanup();
        return 0;
    }
    cout << "Serwer created!" << endl;
    unsigned long b = 0;
    ioctlsocket ( serwer, FIONBIO, &b );
    return 1;
}

Setelah ini saya menerima fungsi pada program mana yang memblokir:

accept(serwer,(SOCKADDR *)(&current_client->address),&current_client->address_length);

Sisi klien:

bool start_client()
{
    WSADATA WsaDat;

    if(WSAStartup(MAKEWORD(2,0),&WsaDat) != 0)
        cout << "WSA error!\n";
    if ( LOBYTE( WsaDat.wVersion ) != 2 || HIBYTE( WsaDat.wVersion ) != 0 )
    {
        cout << "Wrong version of winsocket\n";
        WSACleanup();
                    return false;
    }

    SOCKET Klient;

    Klient = socket(AF_INET, SOCK_STREAM, 0);
    if(Klient == INVALID_SOCKET)
            {
        cout << "Can't create socket socketa!\n";
        WSACleanup();
                    return false;
    }
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port = htons(PORT);                        // 13056
    SockAddr.sin_family = AF_INET;
    SockAddr.sin_addr.S_un.S_addr = inet_addr("*********");      // my remote address
    while(connect(Klient, (SOCKADDR *)(&SockAddr), sizeof(SockAddr)) != 0) 
    {
        cout << "Trying to connect " << WSAGetLastError() << "\n";
        Sleep(500);
    }
    cout << "Connected!\n";
}

Saya telah menambahkan aplikasi klien dan server ke aturan firewall dan saya juga mencoba menghubungkannya pada beberapa port. Sisi server pasti mendengarkan (di sini, di port berbeda):

masukkan deskripsi gambar di sini


person Blood    schedule 02.05.2013    source sumber
comment
Coba hilangkan bagian-bagian yang tidak mutlak diperlukan: SO_REUSEADDR dan FIONBIO. Lalu, alamat jarak jauh mana yang Anda sambungkan? Yang seharusnya berfungsi adalah alamat IP yang melekat pada NIC lokal Anda, lihat output mis. ipconfig. Selain itu, Anda juga dapat mencoba menyambung ke beberapa mesin (misalnya server web) di internet, setidaknya Anda harus dapat membuat sambungan.   -  person Ulrich Eckhardt    schedule 02.05.2013
comment
Kode kesalahan apa yang dikembalikan oleh WSAGetLastError() ketika connect() gagal?   -  person Remy Lebeau    schedule 03.05.2013
comment
@Remy Lebeau - 10060 - Batas Waktu Koneksi   -  person Blood    schedule 03.05.2013
comment
@doomster - bukan itu. 127.0.0.1 dan 192.168.0.10 (alamat lokal saya) berfungsi. Ketika saya mencoba melakukan ini dengan ip saya diperiksa di Whatsmyip.org, tidak berhasil :(   -  person Blood    schedule 03.05.2013
comment
@Blood: apakah modem Internet Anda terhubung langsung ke PC Anda, atau ke router jaringan? Jika yang terakhir, maka Anda harus mengonfigurasi router untuk meneruskan koneksi masuk ke PC yang menjalankan aplikasi server Anda.   -  person Remy Lebeau    schedule 03.05.2013


Jawaban (1)


Tidak ada yang salah dengan kode Anda.

Tidak semua router dan penerjemah alamat jaringan (NAT) mendukung hairpinning, yang merupakan kemampuan untuk terhubung ke IP publik Anda dari dalam jaringan pribadi di belakang NAT.

Jika NAT/router Anda mendukung hal ini, kemungkinan besar Anda perlu mengonfigurasi aturan penerusan port pada NAT/rute untuk memetakan semua lalu lintas TCP yang masuk pada port 14354 (port mendengarkan server Anda) ke alamat IP internal 192.168.0.10 . Pikirkan hal ini dari perspektif router, jika ia melihat dan meminta koneksi masuk pada IP publik - ia perlu mengetahui host mana di jaringan pribadi yang akan meneruskan koneksi tersebut.

person selbie    schedule 03.05.2013