搜索
查看: 863|回复: 1

[分享] 一个简单的 TCP 客户端测试程序

[复制链接]

该用户从未签到

5

主题

23

帖子

0

蝴蝶豆

初级会员

最后登录
2019-7-17
发表于 2019-6-27 09:26:26 | 显示全部楼层 |阅读模式
本帖最后由 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 相关头文件。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <rtthread.h>

  4. /* 引入 lwip socket 头文件 */
  5. #include "lwip/sockets.h"
  6. #include "lwip/netdb.h"
  7. #include "lwip/sys.h"

  8. #define TCP_TEST_HOST    "your host or ip addr" /* 输入你的 TCP server 域名或者 ip 地址 */
  9. #define TCP_TEST_PORT    (80u)                  /* 输入你的 TCP Server 断口号 */
  10. #define TEST_BUFSZ       (1024u)

  11. static const char *send_tcp_req_data = "Hi, I am from tcp client.";

  12. static void _tcp_test(void)
  13. {
  14.     int ret, i;
  15.     char *recv_data;
  16.     struct hostent *host;
  17.     int sock = -1, bytes_received;
  18.     struct sockaddr_in server_addr;

  19.     /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */
  20.     host = gethostbyname(TCP_TEST_HOST);
  21.     if (!host)
  22.     {
  23.         rt_kprintf("gethostbyname failed!\r\n");
  24.         return;
  25.     }
  26.     else
  27.     {
  28.         rt_kprintf("gethostbyname success!\r\n");
  29.     }

  30.     recv_data = calloc(1, TEST_BUFSZ);
  31.     if (recv_data == RT_NULL)
  32.     {
  33.         rt_kprintf("No memory\n");
  34.         return;
  35.     }

  36.     /* 创建一个socket,类型是SOCKET_STREAM,TCP 协议, TLS 类型 */
  37.     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  38.     {
  39.         rt_kprintf("Socket error\n");
  40.         goto __exit;
  41.     }
  42.     else
  43.     {
  44.         rt_kprintf("Socket pass\n");
  45.     }

  46.     /* 初始化预连接的服务端地址 */
  47.     server_addr.sin_family = AF_INET;
  48.     server_addr.sin_port = htons(TCP_TEST_PORT);
  49.     server_addr.sin_addr = *((struct in_addr *)host->h_addr);
  50.     memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));

  51.     rt_kprintf("will connect...\n");
  52.     if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) < 0)
  53.     {
  54.         rt_kprintf("Connect fail!\n");
  55.         goto __exit;
  56.     }
  57.     else
  58.     {
  59.         rt_kprintf("Connect pass!\n");
  60.     }

  61.     /* 发送数据到 socket 连接 */
  62.     ret = send(sock, send_tcp_req_data, strlen(send_tcp_req_data), 0);
  63.     if (ret <= 0)
  64.     {
  65.         rt_kprintf("send error,close the socket.\n");
  66.         goto __exit;
  67.     }
  68.     else
  69.     {
  70.         rt_kprintf("send pass!\n");
  71.     }

  72.     /* 接收并打印响应的数据,使用加密数据传输 */
  73.     bytes_received = recv(sock, recv_data, TEST_BUFSZ - 1, 0);
  74.     if (bytes_received <= 0)
  75.     {
  76.         rt_kprintf("received error,close the socket.\n");
  77.         goto __exit;
  78.     }

  79.     rt_kprintf("recv data:\n");
  80.     for (i = 0; i < bytes_received; i++)
  81.     {
  82.         rt_kprintf("%c", recv_data);
  83.     }

  84. __exit:
  85.     if (recv_data)
  86.         rt_free(recv_data);

  87.     if (sock >= 0)
  88.         close(sock);
  89. }

  90. void tcp_test(void)
  91. {
  92.     rt_thread_t tid;
  93.     tid = rt_thread_create("tcp", _tcp_test, NULL, 4096, 23, 5);
  94.     if (tid)
  95.         rt_thread_startup(tid);
  96.     else
  97.     {
  98.         rt_kprintf("tcp thread create failed!\r\n");
  99.     }
  100. }

  101. #ifdef FINSH_USING_MSH
  102. #include <finsh.h>
  103. MSH_CMD_EXPORT(tcp_test, TCP function test);
  104. #endif /* FINSH_USING_MSH */
复制代码


如果你也是使用 RT-Thread,那么直接复制代码加入编译,然后在 MSH 中运行既可以:

  1. msh /> tcp_test
复制代码
tcp_client.rar (1.32 KB, 下载次数: 3)
回复

使用道具 举报

该用户从未签到

5

主题

23

帖子

0

蝴蝶豆

初级会员

最后登录
2019-7-17
 楼主| 发表于 2019-6-28 08:56:29 | 显示全部楼层
之前粘贴的代码有问题,这下学会怎么插入代码了。

从文本编辑器复制代码,粘贴到论坛里的代码插入标签,提交之后会插入到当前光标位置。
这个时候你看到的代码格式是乱掉的,没有空格缩进等,不要紧,保存提交帖子即可,这个时候会发现,代码格式显示正常了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-19 15:37 , Processed in 0.144751 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表