Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';无法连接到远程ip_C++_Sockets_Tcp_Winsock_Winsock2 - Fatal编程技术网

C++ Can';无法连接到远程ip

C++ Can';无法连接到远程ip,c++,sockets,tcp,winsock,winsock2,C++,Sockets,Tcp,Winsock,Winsock2,我正在尝试连接客户端和服务器。对于本地地址(127.0.0.1),一切都很好,但当我尝试使用我的远程地址时,它不起作用。我在互联网上搜索了这个东西,但什么也找不到 服务器端: bool start_server() { int i = 1; if(WSAStartup(MAKEWORD(2,0),&WsaDat) != 0) { cout << "WSA error!" << endl; system("

我正在尝试连接客户端和服务器。对于本地地址(127.0.0.1),一切都很好,但当我尝试使用我的远程地址时,它不起作用。我在互联网上搜索了这个东西,但什么也找不到

服务器端:

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;
}
客户端:

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";
}
bool启动_客户端()
{
WSADATA WsaDat;
if(WSAStartup(MAKEWORD(2,0),&WsaDat)!=0)

你的代码没有问题

并非所有路由器和网络地址转换器(NAT)都支持,这是从NAT后面的专用网络连接到公共IP的能力


如果您的NAT/路由器确实支持此功能,则可能需要在NAT/路由上配置端口转发规则,以映射端口14354(服务器侦听端口)上的所有传入TCP流量到192.168.0.10的内部IP地址。从路由器的角度考虑,如果它在公共IP上看到和传入的连接请求,它需要知道专用网络上的哪个主机要将该连接转发到。

尝试删除不完全必要的部分:SO_REUSEADDR和FIONBIO。然后,哪个“远程地址”您是否正在连接?应该可以工作的是连接到本地NIC的IP地址,请参阅例如“ipconfig”的输出。此外,您可以尝试连接到internet上的某台计算机(例如Web服务器),至少您应该能够建立连接。
WSAGetLastError()返回了什么错误代码
连接()失败时?@Remy Lebeau-10060-连接Timeout@doomster-不是这样。127.0.0.1和192.168.0.10(我的本地地址)有效。当我尝试在whatsmyip.org上检查我的ip时,它不起作用:(@Blood:您的Internet调制解调器是直接连接到您的PC还是网络路由器?如果是后者,则您必须将路由器配置为将入站连接端口转发到运行服务器应用程序的PC。
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";
}