你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
jye777 提问时间:2019-4-26 15:46 /
用两个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),所以理论上套接字是有效的,那就是说明中的无效状态,一直没明白是怎么回事,求助高人指点一二。


  1. void client_task(const void* pdata)
  2. {
  3.         int sd = 0, ret = 0, addrLen = 0;
  4.         SOCKADDR_IN sAddr;
  5.         char sBuf[64] = "I'm a client.";
  6.         char rBuf[64] = {0};
  7.        
  8.         sd = socket (AF_INET, SOCK_DGRAM , 0);
  9.         sAddr.sin_family = PF_INET;
  10.         sAddr.sin_port = htons(SERVER_PORT);
  11.         sAddr.sin_addr.s_b1 = 192;
  12.         sAddr.sin_addr.s_b2 = 168;
  13.         sAddr.sin_addr.s_b3 = 1;
  14.         sAddr.sin_addr.s_b4 = 10;
  15.         memset(&sAddr.sin_zero, 0, 8);
  16.         addrLen = sizeof(SOCKADDR_IN);
  17.        
  18.         osDelay(20000);
  19.        
  20.         while(1)
  21.         {
  22.                 ret = sendto(sd, sBuf, sizeof(sBuf), 0, (SOCKADDR *)&sAddr, addrLen);
  23.                 if(ret <= 0) {
  24.                         printf_error_ex("ret[%d]\n", ret);
  25.                         osDelay(1000);
  26.                         continue;
  27.                 }

  28.                 ret = recvfrom(sd, rBuf, sizeof(rBuf), 0, (SOCKADDR *)&sAddr, &addrLen);
  29.                 if(ret <= 0) {
  30.                         printf_error_ex("ret[%d]\n", ret);
  31.                         osDelay(1000);
  32.                         continue;
  33.                 }
  34.                 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);
  35.                 for(uint8_t i = 0; i < ret; i++) {
  36.                         printf_debug6("%c", rBuf[i]);
  37.                 }
  38.                 printf_debug6("\n");
  39.                
  40.                 osDelay(1000);
  41.         }
  42. }
复制代码

调试信息输出:
[ERROR] #87 client_task(): ret[-2]
[ERROR] #87 client_task(): ret[-2]
[ERROR] #87 client_task(): ret[-2]
[ERROR] #87 client_task(): ret[-2]



收藏 1 评论3 发布时间:2019-4-26 15:46

举报

3个回答
jye777 回答时间:2019-4-26 15:49:53
  1. void server_task(const void* pdata)
  2. {
  3.         int ret = 0, sd = 0, addrLen = 0;
  4.         SOCKADDR_IN sAddr, cAddr;
  5.         char rBuf[64] = {0}, sBuf[64] = {0};
  6.         int16_t cnt = 0;
  7.        
  8.         sd = socket(AF_INET, SOCK_DGRAM, 0);
  9.         if(sd < 0) {
  10.                 printf_error_ex("ret[%d]\n", sd);
  11.                 return;
  12.         }
  13.        
  14.         sAddr.sin_family = PF_INET;
  15.         sAddr.sin_port = htons(SERVER_PORT);
  16.         sAddr.sin_addr.s_addr = INADDR_ANY;
  17.         addrLen = sizeof(SOCKADDR_IN);
  18.        
  19.         ret = bind(sd, (SOCKADDR *)&sAddr, addrLen);
  20.         if(ret < 0) {
  21.                 printf_error_ex("ret[%d]\n", ret);
  22.                 return;
  23.         }
  24.        
  25.         while(1)
  26.         {
  27.                 ret = recvfrom(sd, rBuf, sizeof(rBuf), 0, (SOCKADDR *)&cAddr, &addrLen);
  28.                 if(ret <= 0) {
  29.                         printf_error_ex("ret[%d]\n", ret);
  30.                         continue;
  31.                 }
  32.                 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);
  33.                 for(uint8_t i = 0; i < ret; i++) {
  34.                         printf_debug6("%c", rBuf[i]);
  35.                 }
  36.                 printf_debug6("\n");
  37.                
  38.                 cnt++;
  39.                 sprintf(sBuf, "I got your message: %d", cnt);
  40.                 ret = sendto(sd, sBuf, sizeof(sBuf), 0, (SOCKADDR *)&cAddr, addrLen);
  41.                 if(ret <= 0) {
  42.                         printf_error_ex("ret[%d]\n", ret);
  43.                         continue;
  44.                 }

  45.                 osDelay(2);
  46.         }
  47. }
复制代码
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

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

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中间件的网络协议栈,所以不知道是不是这个协议栈自身的问题。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版