请教下,使用 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);
}
}
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你可以用另外一台电脑当客户端来连,以确认问题。
如果电脑作为客户端,开发板作为 服务器端的话,那么 开发板做服务器端的收发都是没有问题的,这样看来的话,防火墙的可能应该不会很大了吧 ??
目前根据仿真的情况来看,出现的错误是在这个语句里面
{
/* find the outgoing network interface for this packet */
netif = ip_route(&pcb->local_ip, dst_ip); // 这个地方返回的是 netif =0
}
继续追踪程序运行到如下:
2.png (72 KB, 下载次数: 0)
下载附件
2019-3-6 22:04 上传
程序运行到这个函数里面的 172 行时,条件不成立,程序接着运行到 216行条件成立,所有最终返回了 0 ?
这个地方在使用 LwIP v2.0 版本时是没有问题的,现在使用 LwIP V2.1 版本的就不行了 ???
你好,现在的问题是,这个底层的用户层,我已经使用 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 的底层有问题呀 ???
一周热门 更多>