硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4011|回复: 4
收起左侧

[RL-TCPnet V7.X] 简单测试BSP Socket HTTP Post百度服务器,测试相关时间

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2021-1-15 09:11:36 | 显示全部楼层 |阅读模式
  1. /*
  2. *********************************************************************************************************
  3. *
  4. *        模块名称 : TCPnet网络协议栈测试
  5. *        文件名称 : app_tcpnet_lib.c
  6. *        版    本 : V1.0
  7. *        说    明 : 测试的功能说明
  8. *              1. 强烈推荐将网线接到路由器或者交换机上面测试,因为已经使能了DHCP,可以自动获取IP地址。
  9. *              2. 客户端的例子相比服务器的例子稍麻烦些,因为客户端的例子需要用户知道电脑端IP和端口号。
  10. *                 并根据实际情况设置IP和端口号的宏定义,这个配置在文件app_tcpnet_lib.c开头,测试的时
  11. *                 候板子要连接这个IP和端口(下面是默认配置,一定要根据实际情况重新配置,如果不会配置,
  12. *                 看本例程对应的教程即可):
  13. *                 #define IP1            192
  14. *                 #define IP2            168
  15. *                 #define IP3            1
  16. *                 #define IP4            2                 
  17. *                 #define PORT_NUM       1001
  18. *              3. 创建了一个TCP Client,而且使能了局域网域名NetBIOS,用户只需在电脑端ping armfly
  19. *                 就可以获得板子的IP地址,本地端口被设置为1024。
  20. *              4. 用户可以在电脑端用网络调试软件创建TCP Server连接此客户端。
  21. *              5. 按键K1按下,发送8字节的数据给TCP Server。
  22. *              6. 按键K2按下,发送1024字节的数据给TCP Server。
  23. *              7. 按键K3按下,发送5MB字节的数据给TCP Server。
  24. *              8、摇杆OK键按下,连接远程服务器。
  25. *
  26. *        修改记录 :
  27. *                版本号   日期         作者        说明
  28. *                V1.0    2020-01-09   Eric2013     首发
  29. *
  30. *        Copyright (C), 2019-2030, 安富莱电子 www.armfly.com
  31. *
  32. *********************************************************************************************************
  33. */        
  34. #include "includes.h"        



  35. /*
  36. *********************************************************************************************************
  37. *                                          用于本文件的调试
  38. *********************************************************************************************************
  39. */
  40. #if 1
  41.         #define printf_debug printf
  42. #else
  43.         #define printf_debug(...)
  44. #endif


  45. /*
  46. *********************************************************************************************************
  47. *                                  宏定义,远程服务器的IP和端口
  48. *********************************************************************************************************
  49. */
  50. /* 要访问的远程服务器IP和端口配置,也就是电脑端调试助手设置的IP和端口号 */


  51. #define IP1            220
  52. #define IP2            181
  53. #define IP3            38
  54. #define IP4            149

  55. #define PORT_NUM         80

  56. /* 这个是本地端口 */
  57. #define LocalPort_NUM    1024

  58. /*
  59. *********************************************************************************************************
  60. *                                             变量
  61. *********************************************************************************************************
  62. */
  63. NET_ADDR4 addr = { NET_ADDR_IP4, PORT_NUM, IP1,IP2,IP3,IP4};


  64. uint8_t sendbuf[1024];


  65. /*
  66. *********************************************************************************************************
  67. *        函 数 名: TCPnetTest
  68. *        功能说明: TCPnet应用
  69. *        形    参: 无
  70. *        返 回 值: 无
  71. *********************************************************************************************************
  72. */
  73. #include "rl_net_lib.h"
  74. void TCPnetTest_socket(void)
  75. {  
  76.         static char dbuf[1024]={0};
  77.         static char http_data[1024]={0};
  78.         static char cmdjson[1024]="{ "cmd":5,  "sn":1,"companyID":"mmmm" ,"deviceID":"kkk"}";
  79.         
  80.         int cnt=0;
  81.         int len;
  82.         int sock, res;
  83.         unsigned long sck_mode = 0;
  84.         SOCKADDR_IN addr;
  85.     int i=0;
  86.     HOSTENT *host;
  87.     IN_ADDR *addr1;
  88.     int err;
  89.         
  90.         int errcnt=0;
  91.         
  92. //        sprintf(http_data,"POST /api/v3/mcu HTTP/1.1\r\n");
  93. //  sprintf(http_data,"GET /index.html HTTP/1.1\r\n");
  94.     sprintf(http_data,"POST /index.html HTTP/1.1\r\n");
  95. //        
  96. //        sprintf(dbuf, "Content-Length: %d\r\n",strlen( cmdjson) );
  97. //        strcat(http_data,dbuf  );
  98. //        
  99. //        strcat(http_data,"User_Agent: Mozilla/4.0\r\n"  );
  100. //        strcat(http_data,"Connection: close\r\n"  );
  101. //        strcat(http_data,"Content-Type: application/json\r\n"  );
  102. //        
  103.         strcat(http_data,"\r\n" );
  104.         
  105. //        strcat(http_data,cmdjson );

  106.         uint32_t tick1;
  107.         uint32_t tick2;
  108.         
  109.         while (1)
  110.         {
  111.                                 tick1 = osKernelGetTickCount();
  112.                
  113.                                 /* 创建一个socket
  114.                                          第1个参数AF_INET:当前仅支持这个类型的地址族。
  115.                                          第2个参数SOCK_STREAM:表示数据流通信类型,即使用的TCP。
  116.                                          第3个参数0 :配置为0的话,自动跟第2个参数进行协议匹配,这里就是TCP协议。
  117.                                 */
  118.                                 sock = socket (AF_INET, SOCK_STREAM, 0);
  119.                                 if (sock <= 0) //出错了
  120.                                 {
  121.                                                 printf_debug("socket 出错 res = %d. \r\n", res );
  122.                                                 //osDelay(6000);
  123.                                                 continue;
  124.                                 }
  125.                                 
  126.                                 /* 端口号设置为1001 */
  127.                                 addr.sin_port = htons(PORT_NUM);
  128.                                 
  129.                                 /* 与函数socket中的AF_INET作用一样 */
  130.                                 addr.sin_family = PF_INET;
  131.                                 
  132.                                 addr.sin_addr.s_b1 = IP1;
  133.                                 addr.sin_addr.s_b2 = IP2;
  134.                                 addr.sin_addr.s_b3 = IP3;
  135.                                 addr.sin_addr.s_b4 = IP4;
  136.                
  137. //                host = gethostbyname ("www.baidu.com", &err);
  138. //                addr1 = (IN_ADDR *)host->h_addr_list[0];
  139. //               
  140. //                                addr.sin_addr.s_b1 = addr1->s_b1;
  141. //                                addr.sin_addr.s_b2 = addr1->s_b2;
  142. //                                addr.sin_addr.s_b3 = addr1->s_b3;
  143. //                                addr.sin_addr.s_b4 = addr1->s_b4;

  144.                                 /* 客户端连接远程服务器,如果远程服务器还未创建,此函数会立即返回 */
  145.                                 printf("新的  connect . \r\n");
  146.                
  147. //               sck_mode = 0;
  148. //                ioctlsocket (sock, FIONBIO, &sck_mode);
  149. //               
  150. //                                   sck_mode = 1;
  151. //                ioctlsocket (sock, FIO_DELAY_ACK, &sck_mode);
  152. //               
  153. //                                                   sck_mode = 1;
  154. //                ioctlsocket (sock, FIO_FLOW_CTRL, &sck_mode);
  155.               
  156.             
  157.                 tick1 = osKernelGetTickCount();
  158.                                 res = connect (sock, (SOCKADDR *)&addr, sizeof (addr));// BSD_ETIMEDOUT
  159.                                 printf_debug("connect 客户端连接远程服务器状态 res = %d. \r\n", res );
  160.                                 if( res < 0 )
  161.                                 {
  162.                                                 printf("000000000000000000000\r\n");
  163.                                                 closesocket (sock);
  164.                                                 //errcnt++;
  165.                                                 continue;
  166.                                 }

  167.                 send(sock,  http_data, strlen(http_data),0 );
  168.                 //printf("http_data = \r\n[%s]  \r\n", http_data );
  169.                 res = recv (sock, dbuf, sizeof(dbuf), 0);//设置了超时
  170.                 if (res == BSD_ETIMEDOUT ) //超时了回去接着接收
  171.                 {
  172.                         printf_debug("111111111111111 = %d. \r\n", res );
  173.                         //osDelay(6000);
  174.                         closesocket (sock);
  175.                         errcnt++;
  176.                         continue;
  177.                 }
  178.                 else if(  res < 0 )
  179.                 {
  180.                         printf_debug("2222222222222222222 = %d. \r\n", res );
  181.                         closesocket (sock);
  182.                         errcnt++;
  183.                         //osDelay(6000);
  184.                         continue;
  185.                 }
  186.                 else
  187.                 {
  188.                     //printf("HTTP 读取成功 . \r\n");
  189.                     cnt++;
  190.                     dbuf[ res ]= 0;
  191.                     //printf("Receive Data Length = %d ,cnt = %d,  dbuf = [%s].  \r\n ", res ,cnt,dbuf );
  192.                     tick2 = osKernelGetTickCount();
  193.                     tick2 =  tick2  - tick1;
  194.                     printf("#########################= %d ms \r\n",  tick2 );
  195.                     tick1 = osKernelGetTickCount();
  196.                     
  197.                     closesocket (sock);
  198.                     tick2 = osKernelGetTickCount();
  199.                     tick2 =  tick2  - tick1;
  200.                     printf("------%d---------------- = %d ms\r\n", i++, tick2 );        
  201.                 }
  202.                 printf("结束一次cnt = %d, errcnt = %d \r\n",cnt , errcnt );
  203. //              tick2 = osKernelGetTickCount();         
  204. //              tick2 =  tick2  - tick1;      
  205.         }
  206. }

  207. /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-1-15 09:26:26 | 显示全部楼层
不同地区的百度地址略有不同。
简单省事些,没有使用gethostbyname做解析。

QQ截图20210115092139.png

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-1-15 10:36:19 | 显示全部楼层
QQ截图20210115103139.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-1-15 12:40:11 | 显示全部楼层
快6万包了,无错误
QQ截图20210115103139.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
 楼主| 发表于 2021-1-16 09:50:22 | 显示全部楼层
改成不断创建新的Socket,然后统一Close,效果不错。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-28 15:52 , Processed in 0.273821 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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