关于#Linux网络通信#的问题,如何解决?

Linux网络编程练习,宝塔linux面板终端作为服务器端,本机作为客户端,客户端向终端发送字符串,终端输出接收到的字符串,无法建立通信。

程序代码
/*客户端代码,运行在本地的代码*/
        int sockfd = socket(AF_INET, SOCK_STREAM, 0);  //指定IPv4创建流式套接字
        if(sockfd < 0)
        {
                perror("socket error");
                return -1;
        }
        printf("socket = %d\n",sockfd);

        cliaddr.sin_family = AF_INET;
        cliaddr.sin_port = 4444;
        cliaddr.sin_addr.s_addr = inet_addr("192.168.171.129");//指定本地IP和端口

        int ret = bind(sockfd, (struct sockaddr*)&cliaddr, sizeof(cliaddr));//绑定
        if(ret < 0)
        {
                perror("bind error");
                close(sockfd);
                return -1;
        }

        struct sockaddr_in servaddr;
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = 3333;
        servaddr.sin_addr.s_addr = inet_addr("172.16.173.41");//指定服务器IP和端口

        ret = connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));//申请连接服务器
        if(ret< 0)
        {
                perror("connect error");
                close(sockfd);
        }

        char buf[100] = {0};
        fgets(buf, sizeof(buf), stdin);
        ret = send(sockfd, buf, sizeof(buf), 0);//向服务器发送buf
        if(ret < 0)
        {
                perror("send error");
                close(sockfd);
                return -1;
        }
/*服务器端代码,也就是运行在宝塔Linux面板终端上的程序代码*/
    int sockFd = socket(AF_INET, SOCK_STREAM, 0);//create socket to get fd
    if(sockFd < 0)
    {
        perror("socket error");
        return -1;
    }
    printf("sockFd = %d\n",sockFd);

    struct sockaddr_in servaddr;
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = 3333;//PORT
    servaddr.sin_addr.s_addr = inet_addr("172.16.173.41");//服务器端IP
    
    int ret = bind(sockFd, (struct sockaddr*)&servaddr, sizeof(servaddr));//将套接字与指定端口绑定
    if(ret < 0)
    {
        perror("bind error");
        close(sockFd);
        return -1;
    }
    printf("bind OK\n");

    ret = listen(sockFd, 5);//监听套接字
    if(ret < 0)
    {
        perror("listen error");
        close(sockFd);
        return -1;
    }
    printf("listening...\n");

    struct sockaddr_in cliaddr;
    socklen_t addrlen = sizeof(cliaddr);
    int connfd = accept(sockFd, (struct sockaddr*)&cliaddr, &addrlen);//连接成功后返回新建的套接字
    if(connfd < 0)
    {
        perror("accept error");
        close(sockFd);
        return -1;
    }

    char buf[100] = {0};
    ret = recv(connfd, buf, sizeof(buf), 0);//接收从客户端发过来的字符串
    if(ret < 0)
    {
        perror("recv error");
        close(connfd);
        close(sockFd);
        return -1;
    }
    printf("receive: %s\n",buf);

    close(connfd);
    close(sockFd);
    return 0;

运行结果及报错内容

分别编译运行后,结果如下;左边是服务器终端(宝塔Linux面板终端),右边是客户端终端(也就是本机)

img

我的解答思路和尝试过的方法

从右边的perror看出,应该是connect()函数发出的TCP连接请求失败了,原因是服务器端拒绝连接。服务器端是在阿里云租的ECS服务器,但是在云服务器管理控制台已经将3333端口打开了

img

还有一个很奇怪的现象,两台机器ping百度都是能连上的;但是两台机器ping对方就都连不上

img

我想要达到的结果

两端能进行通信。

通信的话本地请求线上可以让线上接收到数据 但是你线上通本地怎么通?那走的是外网ip,你拿内网?