jye777 发表于 2019-4-26 15:46:23

UDP客户端recvfrom返回-2(BSD_ERROR_SOCKET)

用两个STM32F407板子实验UDP通讯,一个做Server,一个做Client,交换机上分别接两张板子和一台调试电脑。
Server:mac = "00-01-02-1C-55-81"ip = "192.168.1.10"
Client:mac = "00-01-02-1C-55-82"ip = "192.168.1.11"

之前实验TCP都没有问题,但换成UDP后,Client使用recvfrom后返回-2,查询为:
BSD_ERROR_SOCKET = Socket invalid or in invalid state.
打印过sendto和recvfrom的套接字,是一个值(5),所以理论上套接字是有效的,那就是说明中的无效状态,一直没明白是怎么回事,求助高人指点一二。


void client_task(const void* pdata)
{
        int sd = 0, ret = 0, addrLen = 0;
        SOCKADDR_IN sAddr;
        char sBuf = "I'm a client.";
        char rBuf = {0};
       
        sd = socket (AF_INET, SOCK_DGRAM , 0);
        sAddr.sin_family = PF_INET;
        sAddr.sin_port = htons(SERVER_PORT);
        sAddr.sin_addr.s_b1 = 192;
        sAddr.sin_addr.s_b2 = 168;
        sAddr.sin_addr.s_b3 = 1;
        sAddr.sin_addr.s_b4 = 10;
        memset(&sAddr.sin_zero, 0, 8);
        addrLen = sizeof(SOCKADDR_IN);
       
        osDelay(20000);
       
        while(1)
        {
                ret = sendto(sd, sBuf, sizeof(sBuf), 0, (SOCKADDR *)&sAddr, addrLen);
                if(ret <= 0) {
                        printf_error_ex("ret[%d]\n", ret);
                        osDelay(1000);
                        continue;
                }

                ret = recvfrom(sd, rBuf, sizeof(rBuf), 0, (SOCKADDR *)&sAddr, &addrLen);
                if(ret <= 0) {
                        printf_error_ex("ret[%d]\n", ret);
                        osDelay(1000);
                        continue;
                }
                printf_debug6_ex("Receive[%d] from %u.%u.%u.%u\n", ret, sAddr.sin_addr.s_b1, sAddr.sin_addr.s_b2, sAddr.sin_addr.s_b3, sAddr.sin_addr.s_b4);
                for(uint8_t i = 0; i < ret; i++) {
                        printf_debug6("%c", rBuf);
                }
                printf_debug6("\n");
               
                osDelay(1000);
        }
}
调试信息输出:
#87 client_task(): ret[-2]
#87 client_task(): ret[-2]
#87 client_task(): ret[-2]
#87 client_task(): ret[-2]



jye777 发表于 2019-4-26 15:49:53

void server_task(const void* pdata)
{
        int ret = 0, sd = 0, addrLen = 0;
        SOCKADDR_IN sAddr, cAddr;
        char rBuf = {0}, sBuf = {0};
        int16_t cnt = 0;
       
        sd = socket(AF_INET, SOCK_DGRAM, 0);
        if(sd < 0) {
                printf_error_ex("ret[%d]\n", sd);
                return;
        }
       
        sAddr.sin_family = PF_INET;
        sAddr.sin_port = htons(SERVER_PORT);
        sAddr.sin_addr.s_addr = INADDR_ANY;
        addrLen = sizeof(SOCKADDR_IN);
       
        ret = bind(sd, (SOCKADDR *)&sAddr, addrLen);
        if(ret < 0) {
                printf_error_ex("ret[%d]\n", ret);
                return;
        }
       
        while(1)
        {
                ret = recvfrom(sd, rBuf, sizeof(rBuf), 0, (SOCKADDR *)&cAddr, &addrLen);
                if(ret <= 0) {
                        printf_error_ex("ret[%d]\n", ret);
                        continue;
                }
                printf_debug6_ex("Receive[%d] from %u.%u.%u.%u\n", ret, cAddr.sin_addr.s_b1, cAddr.sin_addr.s_b2, cAddr.sin_addr.s_b3, cAddr.sin_addr.s_b4);
                for(uint8_t i = 0; i < ret; i++) {
                        printf_debug6("%c", rBuf);
                }
                printf_debug6("\n");
               
                cnt++;
                sprintf(sBuf, "I got your message: %d", cnt);
                ret = sendto(sd, sBuf, sizeof(sBuf), 0, (SOCKADDR *)&cAddr, addrLen);
                if(ret <= 0) {
                        printf_error_ex("ret[%d]\n", ret);
                        continue;
                }

                osDelay(2);
        }
}

butterflyspring 发表于 2019-5-23 16:29:51

官方的库文件中有相关这样的例程,可以参照和测试一下:)
STM32Cube_FW_F4_V1.24.1\Projects\STM324xG_EVAL\Applications\LwIP\LwIP_UDP_Echo_Client
STM32Cube_FW_F4_V1.24.1\Projects\STM324xG_EVAL\Applications\LwIP\LwIP_UDP_Echo_Server

jye777 发表于 2019-8-16 17:02:35

butterflyspring 发表于 2019-5-23 16:29
官方的库文件中有相关这样的例程,可以参照和测试一下
STM32Cube_FW_F4_V1.24.1\Projects\STM324xG_EVAL\ ...

没有使用LWIP,用的是MDK-Middleware中间件的网络协议栈,所以不知道是不是这个协议栈自身的问题。
页: [1]
查看完整版本: UDP客户端recvfrom返回-2(BSD_ERROR_SOCKET)