Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
LwIP无法获取host
发布于 2010-09-02 22:46:34 浏览:10664
订阅该版
调用这个函数不成功. ``` rt_bool_t tcp_client(char* send_data, char* recv_data) { int port; struct hostent *host; int sock, bytes_received; struct sockaddr_in server_addr; const char* url="192.168.1.2"; /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */ port = 80; host = gethostbyname(url); /* 分配用于存放接收数据的缓冲 */ if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { rt_kprintf("Socket errorn"); return RT_FALSE; } /* 初始化预连接的服务端地址 */ server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr = *((struct in_addr *)host->h_addr); rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); /* 连接到服务端 */ if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { /* 连接失败 */ rt_kprintf("Connect errorn"); return RT_FALSE; } while(1) { /* 从sock连接中接收最大1024字节数据 */ bytes_received = recv(sock, recv_data, 1024, 0); if (bytes_received < 0) { /* 接收失败,关闭这个连接 */ lwip_close(sock); return RT_FALSE; } /* 鏈夋帴鏀跺埌鏁版嵁锛屾妸鏈??娓呴浂 */ recv_data[bytes_received] = ' '; if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0) { /* 有接收到数据,把末端清零 */ lwip_close(sock); break; } /* 发送数据到sock连接 */ send(sock,send_data,strlen(send_data), 0); } return RT_TRUE; } ``` 主要是gethostbyname这个函数通不过. 应当没有抓到包吧.第一次用WiresharkPortable,还不会看.呵呵 [attach]0[/attach]      
查看更多
11
个回答
默认排序
按发布时间排序
Gavin_Li
2010-09-02
这家伙很懒,什么也没写!
调试发现是下面的函数中通不过 struct sys_timeouts *sys_arch_timeouts(void) { rt_thread_t self = rt_thread_self(); struct lwip_thread* lwip_th = (struct lwip_thread*)self->user_data; if (lwip_th != RT_NULL) { RT_ASSERT(lwip_th->magic == LWIP_THREAD_MAGIC); ------这里通不过. return &(lwip_th->timeouts); } return RT_NULL; } 我的配置如下: /* ip address of target */ #define RT_LWIP_IPADDR0 192 #define RT_LWIP_IPADDR1 168 #define RT_LWIP_IPADDR2 1 #define RT_LWIP_IPADDR3 15 /* gateway address of target */ #define RT_LWIP_GWADDR0 192 #define RT_LWIP_GWADDR1 168 #define RT_LWIP_GWADDR2 1 #define RT_LWIP_GWADDR3 1 /* mask address of target */ #define RT_LWIP_MSKADDR0 255 #define RT_LWIP_MSKADDR1 255 #define RT_LWIP_MSKADDR2 255 #define RT_LWIP_MSKADDR3 0 为什么上面的图中的目标地址是192.168.1.255呢?(我这样配置不是设定开发板的IP为192.168.15吗?) 是不是没ping通啊,但是我的开发板上的网口灯是亮的.而且PC机的网络图标也由断开变为连接.
mbbill
2010-09-03
这家伙很懒,什么也没写!
gethostbyname怎么传了一个ip地址进去了。 另外你确定是在RT_ASSERT(lwip_th->magic == LWIP_THREAD_MAGIC);这个地方卡住了么
Gavin_Li
2010-09-03
这家伙很懒,什么也没写!
>gethostbyname怎么传了一个ip地址进去了。 >另外你确定是在RT_ASSERT(lwip_th->magic == LWIP_THREAD_MAGIC);这个地方卡住了么 --- 不传ip,传什么呢? 我单步调试很多次,都是这里RT_ASSERT(lwip_th->magic == LWIP_THREAD_MAGIC);卡主了
bernard
2010-09-03
这家伙很懒,什么也没写!
通常ip地址是不需要再进行域名解析的(gethostbyname),域名才需要进行解析。 不过传一个ip地址进去也不应该会卡在这个地方,得看看gethostbyname中调用了什么API,按理不应该在使用lwip timer的方式。
Gavin_Li
2010-09-03
这家伙很懒,什么也没写!
今晚试了一下,PC机可以ping得通开发板 [attach]469[/attach] [attach]470[/attach] [attach]471[/attach] [attach]472[/attach] [attach]473[/attach]
Gavin_Li
2010-09-04
这家伙很懒,什么也没写!
今天用FinSH试了UDPClient,发现可以发数据出去. 但是如果放到GUI线程去执行UDPClient,则不能发数据出去.同样是无法获取到host.我怀疑是GUI和LwIP有资源方面的冲突. 测试代码如下: ``` #include "demo_view.h" #include
#include
static void TCP_Client(struct rtgui_widget* widget, rtgui_event_t* event) { tcpclient("192.168.1.2",80); /*tcpclient("http://192.168.1.2/default.html",80); tcpclient("192.168.1.2",139);*/ } static void UDP_Client(struct rtgui_widget* widget, rtgui_event_t* event) { udpclient("192.168.1.2",138,2); } static void TCP_Server(struct rtgui_widget* widget, rtgui_event_t* event) { tcpserv(RT_NULL); } static void UDP_Server(struct rtgui_widget* widget, rtgui_event_t* event) { udpserv(RT_NULL); } rtgui_view_t *test_lwip(rtgui_workbench_t* workbench) { rtgui_view_t *view1; rtgui_button_t *button; rtgui_rect_t widget_rect; view1 = demo_view(workbench, "test"); demo_view_get_rect(view1, &widget_rect); widget_rect.x1 = 5; widget_rect.x2 = widget_rect.x1 + 50; widget_rect.y1 = 170; widget_rect.y2 = widget_rect.y1 + 20; button = rtgui_button_create("TCPClient"); rtgui_widget_set_rect(RTGUI_WIDGET(button), &widget_rect); rtgui_container_add_child(RTGUI_CONTAINER(view1), RTGUI_WIDGET(button)); rtgui_button_set_onbutton(button, TCP_Client); widget_rect.x1 = widget_rect.x2 + 10; widget_rect.x2 += 50; button = rtgui_button_create("UDPClient"); rtgui_widget_set_rect(RTGUI_WIDGET(button), &widget_rect); rtgui_container_add_child(RTGUI_CONTAINER(view1), RTGUI_WIDGET(button)); rtgui_button_set_onbutton(button, UDP_Client); widget_rect.x1 = widget_rect.x2 + 10; widget_rect.x2 += 50; button = rtgui_button_create("TCPServer"); rtgui_widget_set_rect(RTGUI_WIDGET(button), &widget_rect); rtgui_container_add_child(RTGUI_CONTAINER(view1), RTGUI_WIDGET(button)); rtgui_button_set_onbutton(button, TCP_Server); widget_rect.x1 = widget_rect.x2 + 10; widget_rect.x2 += 50; button = rtgui_button_create("UDPServer"); rtgui_widget_set_rect(RTGUI_WIDGET(button), &widget_rect); rtgui_container_add_child(RTGUI_CONTAINER(view1), RTGUI_WIDGET(button)); rtgui_button_set_onbutton(button, UDP_Server); return view1; } ```
bernard
2010-09-05
这家伙很懒,什么也没写!
有完整的代码吗? 总的来说应该没有冲突,但如果是一个纯粹的lwip线程则会和GUI线程冲突,因为两者都用了thread中的私有域,而这个私有域只能放置一种类型的数据。 一般来说,RT-Thread都不会创建出纯粹的lwip线程(纯粹的lwip线程才会有你最开始说的timeout问题),gethostbyname的问题,请mbbill或shaolin检查下吧。
Gavin_Li
2010-09-05
这家伙很懒,什么也没写!
完整代码就是我发的测试代码了.我其实就是用button的onclick函数来替代FinSH调用TCPClient,UDPClient函数.如果你那边没有出现这种情况,那估计是我的环境出问题了.
Gavin_Li
2010-09-15
这家伙很懒,什么也没写!
版主有没有发现问题啊? 这个问题困扰我很久了。昨天我试着用submit 线程的方式去执行http请求。发现是可以的。 struct sys_timeouts *sys_arch_timeouts(void) { rt_thread_t self = rt_thread_self(); --------这里得到的是GUI线程,是不是这里的问题啊? struct lwip_thread* lwip_th = (struct lwip_thread*)self->user_data; if (lwip_th != RT_NULL) -------因为得到的是GUI线程,所以不为NULL.如果是独立的线程,这里就直接跳过了。 { RT_ASSERT(lwip_th->magic == LWIP_THREAD_MAGIC); return &(lwip_th->timeouts); } return RT_NULL; }
bernard
2010-09-15
这家伙很懒,什么也没写!
是的,如果在GUI线程里调用了这个sys_arch_timeouts函数肯定会出问题的,正如你了解的那样,因为这个不是lwip线程而是GUI线程,所以肯定会挂掉。 你这里的magic检查非常合理。只是为什么还是会调用sys_arch_timeouts函数不是太明白,这段时间太忙了,来不及仔细看,抱歉。
撰写答案
登录
注册新账号
关注者
0
被浏览
10.7k
关于作者
Gavin_Li
这家伙很懒,什么也没写!
提问
28
回答
74
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RTT串口查找函数使用过程中遇到的问题。
2
RT-Thread CI编译产物artifacts自动上传功能介绍
3
STM32G030移植RT-Thread
4
CubeMX & RT-Thread Studio 联合开发说明
5
RT-Thread项目助手v0.3 | Ubuntu与MacOS平台的RT-Thread Env
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
rt-smart
RTC
FAL
cubemx
I2C_IIC
ESP8266
UART
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
GD32
定时器
ADC
flashDB
编译报错
socket
中断
rt_mq_消息队列_msg_queue
keil_MDK
Debug
SFUD
ulog
msh
C++_cpp
MicroPython
本月问答贡献
出出啊
1522
个答案
343
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
814
个答案
179
次被采纳
crystal266
555
个答案
162
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
6
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部