搜索
bottom↓
回复: 0

rt-thread TCP客户端自动连接代码

[复制链接]

出0入0汤圆

发表于 2017-12-6 15:11:06 | 显示全部楼层 |阅读模式
各位好!最近要用到以太网通信,系统是rt-thread,根据官方的TCP客户端例程,
修改了几个地方,加入了TCP断开之后的重新连接,测试了一天没有出现问题,欢迎讨论


  1. #include <rtthread.h>

  2. //#include <lwip/netdb.h>   /* 为了解析主机名,需要包含netdb.h头文件 */
  3. //#include <lwip/sockets.h> /* 使用BSD socket,需要包含sockets.h头文件 */

  4. #include <sys/socket.h> /* 使用BSD socket,需要包含sockets.h头文件 */
  5. #include "netdb.h"
  6. /* 服务器地址或者域名 */
  7. char  tcp_url[32] =  "192.168.1.17";

  8. /* 端口号 */
  9. int tcp_c_port = 12345;

  10. static const char send_data[] = "This is TCP Client from rt-thread "; /* 发送用到的数据 */

  11. #define BUFSZ 512

  12. void tcpclient(void *p)
  13. {
  14.     int ret;
  15.     char *recv_data;
  16.     struct hostent *host;
  17.     int sock, bytes_received;
  18.     struct sockaddr_in server_addr;
  19.        
  20.         /*地址和端口号 */
  21.     char* url =  tcp_url;
  22.     int port = tcp_c_port;

  23.     /* 需要等待PHY芯片初始化完成 */
  24.         rt_thread_delay(100);
  25.        
  26.     /* 通过函数入口参数url获得host地址(如果是域名,会做域名解析) */
  27.     host = gethostbyname(url);

  28.     /* 分配用于存放接收数据的缓冲 */
  29.     recv_data = rt_malloc(BUFSZ);
  30.     if (recv_data == RT_NULL)
  31.     {
  32.         rt_kprintf("No memory\n");
  33.         return;
  34.     }
  35.        
  36.     /* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */
  37.     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  38.     {
  39.         /* 创建socket失败 */
  40.         rt_kprintf("Socket error\n");
  41.        
  42.         /* 释放接收缓冲 */
  43.         rt_free(recv_data);
  44.         return;
  45.     }

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

  51.     /* 连接到服务端 最多尝试连接 5次 */
  52.     if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
  53.     {
  54.                
  55.     }

  56.     while(1)
  57.     {
  58.         /* 从sock连接中接收最大BUFSZ - 1字节数据 */
  59.         bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
  60.         if (bytes_received < 0)
  61.         {
  62.             /* TCP重连 */
  63.             goto again;
  64.         }
  65.         else if (bytes_received == 0)
  66.         {
  67.                         /* 这种情况就是链路断开了?? */
  68.             /* 打印recv函数返回值为0的警告信息 */
  69.             rt_kprintf("\nReceived warning,recv function return 0.\r\n");
  70.                        
  71.             /* TCP重连 */
  72.             goto again;   
  73.   
  74.         }

  75.         /* 有接收到数据,把末端清零 */
  76.         recv_data[bytes_received] = '\0';

  77.         rt_kprintf("\nReceived data\n = %s " , recv_data);
  78.             
  79.         /* 发送数据到sock连接 */
  80.         ret = send(sock,send_data_buffer, 138, 0);
  81.         if (ret > 0)
  82.         {
  83.             /* 数据发送成功 直接退出即可 */
  84.         }
  85.         else if (ret < 0)
  86.         {
  87.             /* 发送失败,重新连接 */
  88.             rt_kprintf("\n send error,close the socket.\r\n");
  89.                        
  90.             /* 重连*/
  91.             goto again;   
  92.         }
  93.         else if (ret == 0)
  94.         {
  95.             /* 打印send函数返回值为0的警告信息 */
  96.             rt_kprintf("\n Send warning,send function return 0.\r\n");
  97.                        
  98.                         /* 重连*/
  99.                         goto again;   
  100.         }
  101.                
  102.                 /* 客户端和服务器连接正常情况下执行到此处即可 */
  103.         continue;

  104.         /* 客户端重连部分 */
  105.         again:
  106.         {
  107.             /* 链接失败 关闭SOCKET */
  108.             closesocket(sock);
  109.             
  110.              rt_thread_delay(1);
  111.             
  112.             /* 创建一个socket,类型是SOCKET_STREAM,TCP类型 */
  113.             if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  114.             {
  115.                 /* 创建socket失败 */
  116.                 rt_kprintf("Socket error\n");
  117.                 return;
  118.             }
  119.    
  120.             if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
  121.             {
  122.                         /* 连接失败 */
  123.                         rt_kprintf("Connect fail!\n");

  124.                         /* 稍微延时一下 */
  125.                        
  126.                 rt_thread_delay(100);
  127.             
  128.                 /* TCP重连 */
  129.                 goto again;   
  130.             }
  131.         }

  132.         #if 0
  133.         erro:
  134.         {
  135.             /* 连接失败 */
  136.             rt_kprintf("Connect fail!\n");

  137.             closesocket(sock);

  138.             /*释放接收缓冲 */
  139.             rt_free(recv_data);
  140.             return;
  141.         }
  142.         #endif
  143.     }
  144. }

  145. /* 线程栈大小 */
  146. #define THREAD_STACK_SIZE 512

  147. /* 优先级 */
  148. #define THREAD_PRIORITY 22

  149. /* 线程时间片 */
  150. #define  THREAD_TIMESLICE 10

  151. int tcp_client_thread_init(void)
  152. {
  153.     rt_thread_t tid;

  154.     tid = rt_thread_create("tcp_c",
  155.         tcpclient, RT_NULL,
  156.         THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE);
  157.     if (tid != RT_NULL)
  158.         rt_thread_startup(tid);
  159.    
  160.     return 0;
  161. }

  162. #ifdef RT_USING_FINSH

  163. #include <finsh.h>
  164. /* 输出tcpclient函数到finsh shell中 */
  165. FINSH_FUNCTION_EXPORT(tcp_client_thread_init, startup tcp client);

  166. #endif
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 23:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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