完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请教下,使用 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 datarn"; struct sockaddr_in ServerAddr; //开发板为客户端时,需要保存服务器端的 IP 地址及端口号 struct sockaddr_in ClientAddr; // 开发板为客户端时,需要连接本机的 IP 地址及 端口号 //开发板为客户端连接远程(服务器)端 uint8_t Socket_UDP_ClientConnect(void) { err_t err; int ret; USART_OS_Printf("%sn", "Socket_UDP_ClientConnect STATUSisconnected ...rn"); 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:%drn", // 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:%drn", // Local lwipdev.Local_IpAddr[0], lwipdev.Local_IpAddr[1], lwipdev.Local_IpAddr[2], lwipdev.Local_IpAddr[3], TCP_LOCAL_PORT); USART_OS_Printf("%sn", "STATUS:Connect OKn"); 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("%srn",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 = %drn", err); } else //数据发送失败,打印错误代码 { USART_OS_Printf("lwip socket send state ERR = %d ?rn", err); } } } } } |
|
相关推荐
1个回答
|
|
这里有服务器和客户端,PC 做服务器,板子做客户端是没有问题的,建议你试一下这个例子程序{:1:}
STM32Cube_FW_F7_V1.5.0ProjectsSTM32756G_EVALApplicationsLwIP |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1884 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1663 浏览 1 评论
1149 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
763 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1720 浏览 2 评论
1964浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
790浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
614浏览 3评论
631浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
593浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-13 21:19 , Processed in 0.699572 second(s), Total 46, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号