首页 > 解决方案 > TCP客户端只发送一次消息并陷入循环

问题描述

要求:我正在使用将与外部 TCP 服务器通信的 TCP 客户端。TCP 服务器不会发送任何关于是否收到消息的确认。TCP客户端必须在一定时间后定期发送消息。

我有一个应用程序(GPS 管理器应用程序),它每 5 秒后定期读取 GPS 坐标并通过 mosquitto 发布。我在我的 TCP 发送方 APP 中订阅该主题。在 TCP 发送方应用程序中该消息的消息回调中,我需要将这些详细信息发送到 TCP 服务器(外部)。TCP 服务器不会发送任何消息来请求 GPS 数据。

我能够成功连接到 TCP 服务器。也能够将数据发送到服务器,但只能发送一次。发送数据后,TCP 发送方应用程序不会收到 GPS 管理器应用程序发送的任何消息。

    int32_t SendToServer(ServerClientCfg_t st_TmpServerClientCfg, char *c8_PacketData)
    {
        //int opt = 1;
        int sock = 0;
        // int sent=0;
        int valread;
        int byte=0;

        struct sockaddr_in serv_addr;
        //char *hello = "Hello from client";
        char buffer[1024] = {0};
        if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        {
            printf("\n Socket creation error \n");
            return -1;
        }

        //fcntl(sock, F_SETFL, O_NONBLOCK);

        memset(&serv_addr, '0', sizeof(serv_addr));

        serv_addr.sin_family = AF_INET;
        serv_addr.sin_port = htons(PORT);

        // Convert IPv4 and IPv6 addresses from text to binary form
        if(inet_pton(AF_INET, gst_DataSenderCfg.st_ServerClientCfg[0].pc8_HTTPServerURL, &serv_addr.sin_addr)<=0)
        {
            printf("\nInvalid address/ Address not supported \n");
            return -1;
        }

        if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
        {
            printf("\nConnection Failed \n");
            return -1;
        }

        while(1)
        {
            byte= send(sock , c8_PacketData , strlen(c8_PacketData) , 0 );
            printf("Bytes sent : %d\n",byte);
            printf("Count : %d  : Message sent from client :  %s\n\n",count,c8_PacketData);
            count++;
            sleep(1);
            break;              
        }
        return 0;
    }

预期结果:TCP 服务器应在 5 秒后定期接收 GPS 数据。

当前结果:服务器仅接收一次数据。

标签: csocketstcpclientembedded-linux

解决方案


推荐阅读