金牌会员
- 积分
- 1887
- 金钱
- 1887
- 注册时间
- 2012-10-28
- 在线时间
- 353 小时
|
楼主 |
发表于 2019-3-8 19:10:59
|
显示全部楼层
本帖最后由 hpdell 于 2019-3-8 20:47 编辑
你好,我的 打印出来的IP 地址为
printf("netif_ip4_addr(netif) : %s \r\n",ip4addr_ntoa(netif_ip4_addr(netif)));
netif_ip4_addr(netif) : 0.0.0.0 // LwIP V2.1.x 版本里面输出的是貌似全部都是 0 ??????????、
输出地址为0 的话,是哪个地方没有设置对呀 ??
LwIP V2.0.x 版本里面输出的是 netif_ip4_addr(netif) : 245.9.9.9 这个IP,但是数据收发正常
// 我的 socket udp 相关函数如下
// socket udp 连接初始化,开发板初始化为服务器端
uint8_t Socket_UDP_ServerConnectInit(void)
{
int ret; //,err;
struct sockaddr_in ServerAddr;
USART_OS_Printf("%s\n", "STATUSisconnected ...\r\n");
TCP_CONNECT_BREAK_FLAG;
while(1)
{
//第一步: 创建socket对象
xSocket.s = lwip_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//IPV4 SOCK_DGRAM 数据报套接字(UDP协议)
//IPPROTO_UDP
//当第三个参数为 0时,自动选择协议
if(xSocket.s == -1 ){
continue;
}
//第二步: 创建网络通信对象,绑定客户端 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地址
inet_addr(ip4addr_ntoa((const ip4_addr_t *) & lwipdev.Local_IpAddr[0]));
/* socket udp 设置的是本地的 ip 地址及端口号
也可以使用 htonl(INADDR_ANY);
*/
//第三步: 开发板为服务器端绑定Socket对象,本地IP与端口号链接
ret = bind(xSocket.s, (struct sockaddr*)&ServerAddr, sizeof(ServerAddr)); // 服务器端绑定的是本地任意ip地址
if(0 > ret) //说明绑定失败 ?
{
USART_OS_Printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); // ????
lwip_close(xSocket.s); // close(xClientSocket.s);
return 2;
}
else // 绑定成功
{
ClientAddr.sin_family = AF_INET;
ClientAddr.sin_port = htons(TCP_REMOTE_PORT); // 连接客户端的端口 ,开发板为服务器端,客户端即是远程端了
ClientAddr.sin_addr.s_addr = inet_addr(ip4addr_ntoa((const ip4_addr_t *) & lwipdev.Remote_IpAddr[0])); // 连接客户端 IP
// err = connect(xSocket.s, (struct sockaddr*)&ClientAddr, sizeof(ClientAddr)); // 连接远程ip地址,这个连接不需要,只需要上面的设置即可
// if(err == ERR_OK)
{
TCP_CONNECT_SUCCESS_FLAG;
USART_OS_Printf("远程 IP:%d.%d.%d.%d Port:%d\r\n", // 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\r\n", // Local
lwipdev.Local_IpAddr[0],
lwipdev.Local_IpAddr[1],
lwipdev.Local_IpAddr[2],
lwipdev.Local_IpAddr[3],
TCP_LOCAL_PORT);
USART_OS_Printf("%s\n", "STATUS:Connect OK\n");
}
break ; // 连接成功后退出
}
}
return 0; // 成功
}
//服务器端接收,也就是开发板端,电脑端为客户端
void Socket_UDP_ServerRX(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) //接收的数据
{
CPU_CRITICAL_ENTER(); //进入临界段
//打印客户端的 IP 地址 及端口号
// USART_OS_Printf( "receive from Client IP: %s, Port:%d\r\n", inet_ntoa( ClientAddr.sin_addr ), htons(ClientAddr.sin_port));
Socket_RecvBuf[_s] = '\0';
USART_OS_Printf("%s\r\n",Socket_RecvBuf); //打印接收到的数据
CPU_CRITICAL_EXIT(); //退出临界段
}
else //if(_s <= 0) // 客户端断开, 为0时为超时,小于0时为错误
{
}
}
}
}
const char *Socket_SendBuf = "LwIP RTOS STM32F7 Socket udp Server demo send data\r\n";
//服务器端发送,也就是开发板端,电脑端为客户端
void Socket_UDP_ServerTX(void)
{
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(ClientAddr);
err = sendto( xSocket.s, Socket_SendBuf, strlen((char*)Socket_SendBuf), 0, (struct sockaddr*)&ClientAddr, len );
if(err > 0)
{
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);
}
}
}
}
}
|
|