用两个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[64] = "I'm a client.";
- char rBuf[64] = {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[i]);
- }
- printf_debug6("\n");
-
- osDelay(1000);
- }
- }
复制代码
调试信息输出:
[ERROR] #87 client_task(): ret[-2]
[ERROR] #87 client_task(): ret[-2]
[ERROR] #87 client_task(): ret[-2]
[ERROR] #87 client_task(): ret[-2]
|
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
评分
查看全部评分
没有使用LWIP,用的是MDK-Middleware中间件的网络协议栈,所以不知道是不是这个协议栈自身的问题。