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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版