在线时间8 小时
UID3504249
ST金币104
蝴蝶豆0
注册时间2018-8-30
该用户从未签到
初级会员
- 最后登录
- 2019-7-17
|
本帖最后由 murphyzhao 于 2019-6-28 08:53 编辑
现在都 lwip 210 版本了,无奈,因为客户 SDK 的原因还在捣鼓 lwip151 版本。
将客户 SDK 升级到 RT-Thread 系统的时候,发现低功耗部分与 LWIP 有耦合,不能直接使用 RT-Thread 移植的 LWIP 组件,也就意味着,我不同享受 RT-Thread netdev 组件和 SAL 组件开发的便利。
于是,给自己挖了个坑,把 LWIP151 版本对接到 netdev 和 sal 组件上
为了测试,捣鼓了一个简单的 TCP 客户端程序,后面有时间也把对接 RT-Thread netdev 组件和 SAL 组件的过程也给分享出来。
这里提供的代码基于 BSD-type 风格的 socket 函数接口,你可以在任何支持 BSD socket 的平台上使用这段程序,当然这段程序也可以在包含了 RT-Thread SAL 的使用方法,引入 SAL 相关头文件。
- #include <stdio.h>
- #include <string.h>
- #include <rtthread.h>
- /* 引入 lwip socket 头文件 */
- #include "lwip/sockets.h"
- #include "lwip/netdb.h"
- #include "lwip/sys.h"
- #define TCP_TEST_HOST "your host or ip addr" /* 输入你的 TCP server 域名或者 ip 地址 */
- #define TCP_TEST_PORT (80u) /* 输入你的 TCP Server 断口号 */
- #define TEST_BUFSZ (1024u)
- static const char *send_tcp_req_data = "Hi, I am from tcp client.";
- static void _tcp_test(void)
- {
- int ret, i;
- char *recv_data;
- struct hostent *host;
- int sock = -1, bytes_received;
- struct sockaddr_in server_addr;
- /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */
- host = gethostbyname(TCP_TEST_HOST);
- if (!host)
- {
- rt_kprintf("gethostbyname failed!\r\n");
- return;
- }
- else
- {
- rt_kprintf("gethostbyname success!\r\n");
- }
- recv_data = calloc(1, TEST_BUFSZ);
- if (recv_data == RT_NULL)
- {
- rt_kprintf("No memory\n");
- return;
- }
- /* 创建一个socket,类型是SOCKET_STREAM,TCP 协议, TLS 类型 */
- if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
- {
- rt_kprintf("Socket error\n");
- goto __exit;
- }
- else
- {
- rt_kprintf("Socket pass\n");
- }
- /* 初始化预连接的服务端地址 */
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = htons(TCP_TEST_PORT);
- server_addr.sin_addr = *((struct in_addr *)host->h_addr);
- memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
- rt_kprintf("will connect...\n");
- if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0)
- {
- rt_kprintf("Connect fail!\n");
- goto __exit;
- }
- else
- {
- rt_kprintf("Connect pass!\n");
- }
- /* 发送数据到 socket 连接 */
- ret = send(sock, send_tcp_req_data, strlen(send_tcp_req_data), 0);
- if (ret <= 0)
- {
- rt_kprintf("send error,close the socket.\n");
- goto __exit;
- }
- else
- {
- rt_kprintf("send pass!\n");
- }
- /* 接收并打印响应的数据,使用加密数据传输 */
- bytes_received = recv(sock, recv_data, TEST_BUFSZ - 1, 0);
- if (bytes_received <= 0)
- {
- rt_kprintf("received error,close the socket.\n");
- goto __exit;
- }
- rt_kprintf("recv data:\n");
- for (i = 0; i < bytes_received; i++)
- {
- rt_kprintf("%c", recv_data);
- }
- __exit:
- if (recv_data)
- rt_free(recv_data);
- if (sock >= 0)
- close(sock);
- }
- void tcp_test(void)
- {
- rt_thread_t tid;
- tid = rt_thread_create("tcp", _tcp_test, NULL, 4096, 23, 5);
- if (tid)
- rt_thread_startup(tid);
- else
- {
- rt_kprintf("tcp thread create failed!\r\n");
- }
- }
- #ifdef FINSH_USING_MSH
- #include <finsh.h>
- MSH_CMD_EXPORT(tcp_test, TCP function test);
- #endif /* FINSH_USING_MSH */
复制代码
如果你也是使用 RT-Thread,那么直接复制代码加入编译,然后在 MSH 中运行既可以:
tcp_client.rar
(1.32 KB, 下载次数: 3)
|
|