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

2019-12-12 18:24发布

请教下,使用 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 ";

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 ", "Socket_UDP_ClientConnect STATUS:Disconnected  ... ");
  
  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 ",   // 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 ",  // Local
                                                                                                                        lwipdev.Local_IpAddr[0],
                                                                                                                        lwipdev.Local_IpAddr[1],
                                                                                                                        lwipdev.Local_IpAddr[2],
                                                                                                                        lwipdev.Local_IpAddr[3],
                                                                                                                        TCP_LOCAL_PORT);
                               
                                USART_OS_Printf("%s ", "STATUS:Connect  OK ");

        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] = '';
                                        USART_OS_Printf("%s ",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 ", err);
                                }
                                else  //数据发送失败,打印错误代码
                                {
                                        USART_OS_Printf("lwip socket send state ERR = %d ? ", err);
                                }
                        }
                }
  }
}




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
hpdell
2019-12-13 07:26
本帖最后由 hpdell 于 2019-3-8 11:37 编辑
aozima 发表于 2019-3-7 11:48
你的netif没有linkup


你好,现在的问题是,这个底层的用户层,我已经使用 LwIP V2.0.x 版本的,使用

socket udp 功能都是正常的,收发数据,dhcp 都正常,

现在只是吧 LwIP V2.0.x 版本的升级为 V2.1.x 版本的,升级后,dhcp 正常,但是收发数据 就都不行了啊

netif 在程序初始化时肯定是 linkup 了的啊


#define IPADDR_ANY          ((u32_t)0x00000000UL)
#define INADDR_ANY          IPADDR_ANY

#define ip_addr_isany_val(ipaddr)               ip4_addr_isany_val(ipaddr)

#define ip4_addr_isany_val(addr1)   ((addr1).addr == IPADDR_ANY)

#define ip_2_ip4(ipaddr)                        (ipaddr)


#define netif_ip4_addr(netif)    ((const ip4_addr_t*)ip_2_ip4(&((netif)->ip_addr)))


!ip4_addr_isany_val(*netif_ip4_addr(netif))


进一步查看发现是这句  !ip4_addr_isany_val(*netif_ip4_addr(netif)) 这个条件不成立 ?

这句 绕了一大圈 ip4_addr_isany_val ,他奶奶的,不过还是没有明白   

我绑定的也是类型的
          //第二步: 创建网络通信对象,绑定客户端 ip 及端口
    memset(&ServerAddr, 0, sizeof(ServerAddr));
    ServerAddr.sin_family = AF_INET;
                ServerAddr.sin_port = htons(TCP_LOCAL_PORT );  // 服务器端绑定的是本地端口
    ServerAddr.sin_addr.s_addr =  htonl(INADDR_ANY);   // 服务器端绑定的是本地任意ip地址

不知道是不是这个版本 LwIP 的底层有问题呀 ???


一周热门 更多>