请教下,使用 lwip socket udp 功能,开发板为客户端时不能够...
请教下,使用 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_inServerAddr;//开发板为客户端时,需要保存服务器端的 IP 地址及端口号
struct sockaddr_inClientAddr; // 开发板为客户端时,需要连接本机的 IP 地址及 端口号
//开发板为客户端连接远程(服务器)端
uint8_t Socket_UDP_ClientConnect(void)
{
err_t err;
int ret;
USART_OS_Printf("%s\n", "Socket_UDP_ClientConnect STATUS:Disconnected...\r\n");
TCP_CONNECT_BREAK_FLAG;
while(1)
{
//第一步: 创建socket对象
xSocket.s = lwip_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//IPV4SOCK_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));// 服务器(远程)ip地址
/* socket udp 设置的是本地的 ip 地址及端口号
也可以使用 htonl(INADDR_ANY);
*/
{
{
TCP_CONNECT_SUCCESS_FLAG;
USART_OS_Printf("远程 IP:%d.%d.%d.%dPort:%d\r\n", // Remote
lwipdev.Remote_IpAddr,
lwipdev.Remote_IpAddr,
lwipdev.Remote_IpAddr,
lwipdev.Remote_IpAddr,
TCP_REMOTE_PORT);
USART_OS_Printf("本地 IP:%d.%d.%d.%dPort:%d\r\n",// Local
lwipdev.Local_IpAddr,
lwipdev.Local_IpAddr,
lwipdev.Local_IpAddr,
lwipdev.Local_IpAddr,
TCP_LOCAL_PORT);
USART_OS_Printf("%s\n", "STATUS:ConnectOK\n");
break ;// 连接成功后退出
}
}
}
return 0;// 成功
}
// 开发板为客户端的数据接收
void Socket_UDP_ClientRX(void) //开发板为客户端,接收服务器端发送过来的数据貌似接收不到??? ??
{
if(ReadConnectStatus())// 如果连接成功才运行程序
{
CPU_SR_ALLOC();
int _s;
socklen_tlen;
{
len = sizeof(ClientAddr);
//返回值:以字节计数的消息长度,若无可用消息或对方已经按序结束则返回0,出错返回-1.
_s = recvfrom(xSocket.s, &Socket_RecvBuf,TCP_RX_BUFSIZE,0,(struct sockaddr*)&ClientAddr,&len);
if(_s > 0)//接收的数据
{
Socket_RecvBuf = '\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_tlen;
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);
}
}
}
}
}
这里有服务器和客户端,PC 做服务器,板子做客户端是没有问题的,建议你试一下这个例子程序:)
STM32Cube_FW_F7_V1.5.0\Projects\STM32756G_EVAL\Applications\LwIP 请问下两个问题:
1:开发板使用lwip的socket必须使用操作系统吗?
2:请问将开发板作为UDP服务器端是如何实现的呢? ljhsolo 发表于 2019-8-19 14:11
请问下两个问题:
1:开发板使用lwip的socket必须使用操作系统吗?
2:请问将开发板作为UDP服务器端是如何 ...
第一个问题貌似 是使用 socket 必须得使用 os 系统支持才行
第二个问题,一两句说不清,建议你 参考 st 有提供的 udp 相关的历程,或者你也可以参考一下正点原子的历程也行 socket原是UNIX产物,在windows引入后,其客户端与服务端程序实现难度出现差异化,也即: 你可以随意作为服务端让widows访问,而开发板访问上位机则需驱动程序支持; 无独有偶,开发板usb连接windows,PC端很容易看到开发板闪存和SD卡的内容,反之,你若想通过开发板看windows资源,那简直难于上青天,这其中的道理只有盖茨明白(以前的8086时代,一切真实而平等,精简而裸露,程序高效而自由) UDP 没有严格上的服务器和客户端区别,UDP发送数据只要目的IP 和目的端口就可以发了,
你发送不成功,肯定是哪一个设置不对
页:
[1]