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

请教下,使用 lwip socket udp 功能,开发板为客户端时不能够...

[复制链接]
hpdell 提问时间:2019-2-26 09:32 /
请教下,使用 lwip socket udp 功能,开发板为客户端时不能够接收服务器端发送过来的数据 ?

1,如果开发板为 服务器端,收发都可以

2,如果开发板为 客户端,不能够接收服务器端发送过来的数据,但开发板可以发送数据给服务器端,
    是不是 开发板为 客户端,不能够接收 服务器端发送过来的数据啊 ?????????????

    开发板为客户端相关程序如下:

typedef struct _XTCPCLIENTSOCK{
        int s;                                                          /*socket 标识符 -1无效,>= 0 有效*/

}XTCPCLIENTSOCK;

XTCPCLIENTSOCK xSocket;

//发送数据内容
const char *Socket_SendBuf = "LwIP RTOS STM32 Socket udp Client demo send data\r\n";

struct sockaddr_in  ServerAddr;  //开发板为客户端时,需要保存服务器端的 IP 地址及端口号
struct sockaddr_in  ClientAddr;   // 开发板为客户端时,需要连接本机的 IP 地址及 端口号

//开发板为客户端连接远程(服务器)端
uint8_t Socket_UDP_ClientConnect(void)
{
  err_t err;
        int ret;
       
        USART_OS_Printf("%s\n", "Socket_UDP_ClientConnect STATUSisconnected  ...\r\n");

  TCP_CONNECT_BREAK_FLAG;

  while(1)
  {
                //第一步: 创建socket对象
    xSocket.s = lwip_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//IPV4  SOCK_DGRAM 数据报套接字(UDP协议)
                if(xSocket.s == -1 ){
                        HAL_Delay(250);  //延时 250ms 继续重新创建
                        continue;
                }

               
          //第二步: 创建网络通信对象,绑定客户端 ip 及端口
    memset(&ServerAddr, 0, sizeof(ServerAddr));
    ServerAddr.sin_family = AF_INET;
                ServerAddr.sin_port = htons(TCP_REMOTE_PORT );  // 绑定服务器(远程)端口
    ServerAddr.sin_addr.s_addr =  
                                  inet_addr(ip4addr_ntoa((const ip4_addr_t *) & lwipdev.Remote_IpAddr[0]));  // 服务器(远程)ip地址
                                                                                                                                         /* socket udp 设置的是本地的 ip 地址及端口号
                                                                                                                                                         也可以使用 htonl(INADDR_ANY);  
                                                                                                                                                */

    {
      {
        TCP_CONNECT_SUCCESS_FLAG;

                                USART_OS_Printf("远程 IP:%d.%d.%d.%d  Port:%d\r\n",   // Remote
                                                                                                                        lwipdev.Remote_IpAddr[0],
                                                                                                                        lwipdev.Remote_IpAddr[1],
                                                                                                                        lwipdev.Remote_IpAddr[2],
                                                                                                                        lwipdev.Remote_IpAddr[3],
                                                                                                                        TCP_REMOTE_PORT);

                                USART_OS_Printf("本地 IP:%d.%d.%d.%d  Port:%d\r\n",  // Local
                                                                                                                        lwipdev.Local_IpAddr[0],
                                                                                                                        lwipdev.Local_IpAddr[1],
                                                                                                                        lwipdev.Local_IpAddr[2],
                                                                                                                        lwipdev.Local_IpAddr[3],
                                                                                                                        TCP_LOCAL_PORT);
                               
                                USART_OS_Printf("%s\n", "STATUS:Connect  OK\n");

        break ;  // 连接成功后退出
      }
    }
  }
  return 0;  // 成功
}

// 开发板为客户端的数据接收
void Socket_UDP_ClientRX(void)   //开发板为客户端,接收服务器端发送过来的数据貌似接收不到  ??? ??
{
  if(ReadConnectStatus())  // 如果连接成功才运行程序
  {
                CPU_SR_ALLOC();
                int   _s;
                socklen_t  len;            

                        {
                                len = sizeof(ClientAddr);
                               
                                //返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,出错返回-1.
                                _s = recvfrom(xSocket.s, &Socket_RecvBuf,TCP_RX_BUFSIZE,0,(struct sockaddr*)&ClientAddr,&len);

                                if(_s > 0)  //接收的数据
                                {
                                        Socket_RecvBuf[_s] = '\0';
                                        USART_OS_Printf("%s\r\n",Socket_RecvBuf);  //打印接收到的数据
                                }

        else //if(_s < 0)    // 客户端断开
        {

                                }  
      }
  }
}


/*
函数名称:Socket_UDP_ClientTX
函数功能:Socket_UDP_Client 客户端数据发送
参数:  无
返回值:无
使用说明:在任务 vTask_2 里面周期性调用,间隔10ms
*/
void Socket_UDP_ClientTX(void)    //开发板为客户端,数据发送到服务器端是成功的 ok
{
  volatile u8 _KeyCode;

  if(ReadConnectStatus())  // 如果连接成功才运行程序
  {
                socklen_t  len;
                TCA6424_KeyScan();  //这个是 FreeRTOS 系统没有启动前调用的
                _KeyCode = TCA6424_GetKey();
                if(_KeyCode != KEY_NONE)
                {
                        if(_KeyCode == KEY_DOWN_UP)   // 确认键按下,发送数据
                        {
                                int err;
                                len = sizeof(ServerAddr);
                               
                                //发送tcp_server_sentbuf中的数据,
                                //发送成功返回发送的字节数目
                                //发送失败返回 -1
                                //将字符串传送给server端
                                err = sendto( xSocket.s, Socket_SendBuf, strlen((char*)Socket_SendBuf), 0, (struct sockaddr*)&ServerAddr, len );
                                if(-1 != err)  //数据发送成功,打印发送数据字节数
                                {
                                        USART_OS_Printf("lwip socket send state OK = %d\r\n", err);
                                }
                                else  //数据发送失败,打印错误代码
                                {
                                        USART_OS_Printf("lwip socket send state ERR = %d ?\r\n", err);
                                }
                        }
                }
  }
}



收藏 1 评论5 发布时间:2019-2-26 09:32

举报

5个回答
butterflyspring 回答时间:2019-3-14 16:54:56
这里有服务器和客户端,PC 做服务器,板子做客户端是没有问题的,建议你试一下这个例子程序
STM32Cube_FW_F7_V1.5.0\Projects\STM32756G_EVAL\Applications\LwIP
ljhsolo 回答时间:2019-8-19 14:11:03
请问下两个问题:
1:开发板使用lwip的socket必须使用操作系统吗?
2:请问将开发板作为UDP服务器端是如何实现的呢?
hpdell 回答时间:2019-11-28 15:59:37
ljhsolo 发表于 2019-8-19 14:11
请问下两个问题:
1:开发板使用lwip的socket必须使用操作系统吗?
2:请问将开发板作为UDP服务器端是如何 ...

第一个问题貌似 是使用 socket 必须得使用 os 系统支持才行

第二个问题,一两句说不清,建议你 参考 st 有提供的 udp 相关的历程,或者你也可以参考一下正点原子的历程也行
aiherong 回答时间:2019-11-28 22:44:36
socket原是UNIX产物,在windows引入后,其客户端与服务端程序实现难度出现差异化,也即: 你可以随意作为服务端让widows访问,而开发板访问上位机则需驱动程序支持; 无独有偶,开发板usb连接windows,PC端很容易看到开发板闪存和SD卡的内容,反之,你若想通过开发板看windows资源,那简直难于上青天,这其中的道理只有盖茨明白(以前的8086时代,一切真实而平等,精简而裸露,程序高效而自由)
天臆弄人 回答时间:2020-1-9 08:32:43
UDP 没有严格上的服务器和客户端区别,UDP发送数据只要目的IP 和目的端口就可以发了,
你发送不成功,肯定是哪一个设置不对

所属标签

相似问题

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