Nucleo STM32F7上的UDP回显

时间:2017-06-01 07:16:01

标签: c embedded stm32

我尝试在NUCLEO-F746ZG上建立一个UDP echo服务器,但是当我启动客户端时,我的主板只做了一个答案。

这是我的线程代码:

Hostname 192.168.178.111 resolved as 192.168.178.111

Reply from 192.168.178.111:8, time 46 ms OK
Une connexion existante a dû être fermée par l'hôte distant
Une connexion existante a dû être fermée par l'hôte distant
Une connexion existante a dû être fermée par l'hôte distant
Une connexion existante a dû être fermée par l'hôte distant

Statistics: Received=1, Corupted=0, Lost=0

客户端在计算机上工作:

json()

2 个答案:

答案 0 :(得分:0)

这是预期的。

err = netconn_bind(conn, '0xc0a8b26f', 8); 

仅在您的线程开始时调用,然后在内部是while循环,它始终有效。例如,只允许执行1次。

您可以考虑将此函数重写为类似于此的函数:

static void udpecho_thread(void *arg) {
    err_t err, recv_err;

    LWIP_UNUSED_ARG(arg);
    while (1) { /* Add this loop */
        conn = netconn_new(NETCONN_UDP);
        if (conn != NULL) {
            err = netconn_bind(conn, '0xc0a8b26f', 8);
            if (err == ERR_OK) {
                while (1) {
                    recv_err = netconn_recv(conn, &buf);

                    if (recv_err == ERR_OK) {
                        addr = netbuf_fromaddr(buf);
                        port = netbuf_fromport(buf);
                        netconn_connect(conn, addr, port);
                        buf->addr.addr = 0;
                        netconn_send(conn,buf);
                        netbuf_delete(buf);
                    } else {
                        break; /* Add break to stop inner loop */
                    }
                }
            }
            netconn_delete(conn);
        }
    }
}

您看,格式化代码非常容易

答案 1 :(得分:0)

EchoServeur的解决方案是:

static void udpecho_thread(void *arg) {
    err_t err, recv_err;

    LWIP_UNUSED_ARG(arg);
    while (1) { /* Add this loop */
        conn = netconn_new(NETCONN_UDP);
        if (conn!= NULL) {
            err = netconn_bind(conn, '0xc0a8b26f', 8);
            if (err == ERR_OK) {
                while (1) {
                    recv_err = netconn_recv(conn, &buf);

                    if (recv_err == ERR_OK) {
                        addr = netbuf_fromaddr(buf);
                        port = netbuf_fromport(buf);
                        netconn_sendto(conn,buf,addr,port);

                        netbuf_delete(buf);
                    }
                }
            } else  {
                netconn_delete(conn);
            }
        }
    }
}