发帖
6 0 0

[BWE20]TCP心跳问题求助

夜雨喧嚣
金牌会员

16

主题

15

回帖

2479

积分

金牌会员

积分
2479
BW系列 489 6 2025-9-19 14:45:31

AEADFAFC-3FCF-4de8-AAFE-EBB83522B06D.png

目前在做BW20的二次开发,TCP这块遇到了点问题,设备第一次上电时和服务器心跳通信正常,但是期间重启就会导致发送心跳包不返回,且再发送数据包也不会返回了,不发送心跳包是可以正常通信的,然后心跳超时重连后又正常可以正常通信了,求各位大佬解惑cry

──── 0人觉得很赞 ────

使用道具 举报

请贴出相关代码
2025-9-19 16:32:27

`int socketInit(char* targetIP, int targetPort, int type)
{
int socket_fd = 0;
in_addr_t ip = 0;
char test[100] = {0};
char test2[100] = {0};
int len = 0;
if ((socket_fd = socket(AF_INET, type, 0))<0) {
return -1;
}
if(SOCK_STREAM == type)
{
int opt = 1;
setsockopt(socket_fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(int));

    //setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

    int keepIdle = 10;    // 30秒无数据后启动探测
    int keepInterval = 1; // 每10秒发送一次探测包
    int keepCount = 3;     // 最多探测3次
        
    setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepIdle, sizeof(keepIdle));

    setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPINTVL, &keepInterval, sizeof(keepInterval));

    setsockopt(socket_fd, IPPROTO_TCP, TCP_KEEPCNT, &keepCount, sizeof(keepCount));
    
}
memset(&targetSocket, 0, sizeof(targetSocket));
// inet_aton

targetSocket.sin_family = AF_INET;
targetSocket.sin_port = htons(targetPort);
if(NULL == targetIP)
{
    ip = getActualIP();
}
else
{
    ip = inet_addr(targetIP);
}

targetSocket.sin_addr.s_addr = ip;//inet_addr(targetIP);
ipPrint((uint8_t *)&ip,(uint8_t *)test2);
len = sprintf(test,"ip:%s,dk:%d\r\n",test2,targetPort);
debug_Print((unsigned char *)test,len);
return socket_fd;

}`

static void tcp_client_task(void* arg)
{
    int ret = 0;
    (void)arg;
    while(1)
    {
        sockect_fd = socketInit((char *)sNwoIP, sNWoPort, SOCK_STREAM);
        struct sockaddr_in local_addr;
        local_addr.sin_family = AF_INET;
        local_addr.sin_port = htons(sNWiPort); // 固定端口
        local_addr.sin_addr.s_addr = INADDR_ANY; // 绑定到所有本地接口,可以设定其他ip

        if (lwip_bind(sockect_fd, (struct sockaddr *)&local_addr, sizeof(local_addr)) < 0) {  //设定本地端口
            // 错误处理(例如端口被占用)
            //lwip_close(sockect_fd);
            goto __exit;
        }

        if (connect(sockect_fd, (struct sockaddr*)&targetSocket, sizeof(targetSocket)) == 0) {
            ConnectionStatusSet(1);
        }
        else
        {
            goto __exit;
        }
        regisApp(1,1,NULL);
        while (1) {
            ret = read(sockect_fd, (char *)networkFIFO,recv_LEN);
            if (ret>0) {
                wNetEnterFifo(networkFIFO,ret);
            }
            else if(ret == -1)
            {
                debug_Print("bcl\r\n",5);
                goto __exit;
            }
        }
    __exit:
        ConnectionStatusSet(0);
        socketDeinit(sockect_fd);
        vTaskDelay(relinkTime);
  
    }
    vTaskDelete(NULL);
}
2025-9-19 16:34:08

你好,我贴在下面了,目前测试是不绑定端口可以解决该问题,但是项目需求是绑定端口的
2025-9-19 16:57:53
夜雨喧嚣 发表于 2025-9-19 16:34
你好,我贴在下面了,目前测试是不绑定端口可以解决该问题,但是项目需求是绑定端口的 ...

我们技术同事在群里回复你啦~
2025-9-19 17:00:37
爱笑 发表于 2025-9-19 16:57
我们技术同事在群里回复你啦~

他之前给我的回复是网络波动,但是我实际测试并不是这个原因,所以我才来论坛上问了
2025-9-19 17:10:50
夜雨喧嚣 发表于 2025-9-19 17:00
他之前给我的回复是网络波动,但是我实际测试并不是这个原因,所以我才来论坛上问了 ...

我跟技术同事沟通了,他说跟你在群里进行沟通。
您需要登录后才可以回帖 立即登录
高级模式
返回
统计信息
  • 会员数: 30670 个
  • 话题数: 44748 篇