c++TCP通信使用公网IP无法连接

问题遇到的现象和发生背景

c++TCP通信,客户端填写本地IP可正常使用,填写公网IP就会无法连接

问题相关代码,请勿粘贴截图

服务器:

#include
#include
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
int main() {
    //初始化
    WSADATA wsaData = { 0 };
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    //创建套接字
    SOCKET server_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    //对sockaddr_in结构体填充ip,端口号信息
    struct sockaddr_in server_addr;
    server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8888);
    //绑定套接字和地址信息
    bind(server_socket, (SOCKADDR*)&server_addr, sizeof(server_addr));
    //监听
    listen(server_socket, SOMAXCONN);
    //获取连接请求
    sockaddr_in client_addr;
    int client_size = sizeof(client_addr);
    SOCKET client_socket = accept(server_socket, (SOCKADDR*)&client_addr, &client_size);
    //输出信息
    cout << inet_ntoa(client_addr.sin_addr) << endl;
    //发送
    send(client_socket, "helloworld", 10 + sizeof(char), 0);
    //接受
    char client_recv[MAXBYTE] = { 0 };
    recv(client_socket, client_recv, MAXBYTE, 0);
    for (int i = 0; i < strlen(client_recv); i++) {
        cout << client_recv[i];
    }
    //释放资源
    closesocket(server_socket);
    WSACleanup();
    return 0;
}

客户端

#include
#include
#pragma comment(lib,"Ws2_32.lib")
using namespace std;
int main() {
    WSADATA wsaData = { 0 };
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    SOCKET client_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    struct sockaddr_in client_addr;
    client_addr.sin_addr.S_un.S_addr = inet_addr("115.195.175.120");
    client_addr.sin_family = AF_INET;
    client_addr.sin_port = htons(8888);
    connect(client_socket, (SOCKADDR*)&client_addr, sizeof(client_addr));
    //接受
    char client_recv[MAXBYTE] = { 0 };
    recv(client_socket, client_recv, MAXBYTE, 0);
    for (int i = 0; i < strlen(client_recv); i++) {
        cout << client_recv[i];
    }
    //发送
    send(client_socket, "helloworld", 10 + sizeof(char), 0);
    WSACleanup();
    closesocket(client_socket);
    return 0;
}


我想要达到的结果

请问如何解决,谢谢

这个公网ip对应的服务器,路由器,防火墙有没有开启8888端口的访问以及跳转呢。

客户端程序部署在内网,服务端程序部署在外网云服务器吧?
检查云服务器TCP端口8888是否开放了。同时把云服务器的防火墙关闭了试试。

还有一点,外网IP地址需要是固定的。

先不管程序,你先直接用命令能不能ping通外网IP,能ping通的情况下对应的端口能否telnet,如果以上两部都无法走通,那还没到跟程序有关的地步,纯粹是网络就不通。那就得考虑 网络连接是否正确,ip、掩码、网关等参数是否正确,对端是否打开了相应的端口,防火墙……

直接从问题看,就是网络链路层不通。
当然原因可能很多种,主要集中在服务器的防火墙和线路运营商是否开放相应的IP和端口。