请教下,使用 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 STATUS
isconnected ...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 继续重新创建
con
tinue;
}
//第二步: 创建网络
通信对象,绑定客户端 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);
}
}
}
}
}