|
- /*
- *********************************************************************************************************
- *
- * 模块名称 : TCPnet网络协议栈测试
- * 文件名称 : app_tcpnet_lib.c
- * 版 本 : V1.0
- * 说 明 : 测试的功能说明
- * 1. 强烈推荐将网线接到路由器或者交换机上面测试,因为已经使能了DHCP,可以自动获取IP地址。
- * 2. 客户端的例子相比服务器的例子稍麻烦些,因为客户端的例子需要用户知道电脑端IP和端口号。
- * 并根据实际情况设置IP和端口号的宏定义,这个配置在文件app_tcpnet_lib.c开头,测试的时
- * 候板子要连接这个IP和端口(下面是默认配置,一定要根据实际情况重新配置,如果不会配置,
- * 看本例程对应的教程即可):
- * #define IP1 192
- * #define IP2 168
- * #define IP3 1
- * #define IP4 2
- * #define PORT_NUM 1001
- * 3. 创建了一个TCP Client,而且使能了局域网域名NetBIOS,用户只需在电脑端ping armfly
- * 就可以获得板子的IP地址,本地端口被设置为1024。
- * 4. 用户可以在电脑端用网络调试软件创建TCP Server连接此客户端。
- * 5. 按键K1按下,发送8字节的数据给TCP Server。
- * 6. 按键K2按下,发送1024字节的数据给TCP Server。
- * 7. 按键K3按下,发送5MB字节的数据给TCP Server。
- * 8、摇杆OK键按下,连接远程服务器。
- *
- * 修改记录 :
- * 版本号 日期 作者 说明
- * V1.0 2020-01-09 Eric2013 首发
- *
- * Copyright (C), 2019-2030, 安富莱电子 www.armfly.com
- *
- *********************************************************************************************************
- */
- #include "includes.h"
- /*
- *********************************************************************************************************
- * 用于本文件的调试
- *********************************************************************************************************
- */
- #if 1
- #define printf_debug printf
- #else
- #define printf_debug(...)
- #endif
- /*
- *********************************************************************************************************
- * 宏定义,远程服务器的IP和端口
- *********************************************************************************************************
- */
- /* 要访问的远程服务器IP和端口配置,也就是电脑端调试助手设置的IP和端口号 */
- #define IP1 220
- #define IP2 181
- #define IP3 38
- #define IP4 149
- #define PORT_NUM 80
- /* 这个是本地端口 */
- #define LocalPort_NUM 1024
- /*
- *********************************************************************************************************
- * 变量
- *********************************************************************************************************
- */
- NET_ADDR4 addr = { NET_ADDR_IP4, PORT_NUM, IP1,IP2,IP3,IP4};
- uint8_t sendbuf[1024];
- /*
- *********************************************************************************************************
- * 函 数 名: TCPnetTest
- * 功能说明: TCPnet应用
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- #include "rl_net_lib.h"
- void TCPnetTest_socket(void)
- {
- static char dbuf[1024]={0};
- static char http_data[1024]={0};
- static char cmdjson[1024]="{ "cmd":5, "sn":1,"companyID":"mmmm" ,"deviceID":"kkk"}";
-
- int cnt=0;
- int len;
- int sock, res;
- unsigned long sck_mode = 0;
- SOCKADDR_IN addr;
- int i=0;
- HOSTENT *host;
- IN_ADDR *addr1;
- int err;
-
- int errcnt=0;
-
- // sprintf(http_data,"POST /api/v3/mcu HTTP/1.1\r\n");
- // sprintf(http_data,"GET /index.html HTTP/1.1\r\n");
- sprintf(http_data,"POST /index.html HTTP/1.1\r\n");
- //
- // sprintf(dbuf, "Content-Length: %d\r\n",strlen( cmdjson) );
- // strcat(http_data,dbuf );
- //
- // strcat(http_data,"User_Agent: Mozilla/4.0\r\n" );
- // strcat(http_data,"Connection: close\r\n" );
- // strcat(http_data,"Content-Type: application/json\r\n" );
- //
- strcat(http_data,"\r\n" );
-
- // strcat(http_data,cmdjson );
- uint32_t tick1;
- uint32_t tick2;
-
- while (1)
- {
- tick1 = osKernelGetTickCount();
-
- /* 创建一个socket
- 第1个参数AF_INET:当前仅支持这个类型的地址族。
- 第2个参数SOCK_STREAM:表示数据流通信类型,即使用的TCP。
- 第3个参数0 :配置为0的话,自动跟第2个参数进行协议匹配,这里就是TCP协议。
- */
- sock = socket (AF_INET, SOCK_STREAM, 0);
- if (sock <= 0) //出错了
- {
- printf_debug("socket 出错 res = %d. \r\n", res );
- //osDelay(6000);
- continue;
- }
-
- /* 端口号设置为1001 */
- addr.sin_port = htons(PORT_NUM);
-
- /* 与函数socket中的AF_INET作用一样 */
- addr.sin_family = PF_INET;
-
- addr.sin_addr.s_b1 = IP1;
- addr.sin_addr.s_b2 = IP2;
- addr.sin_addr.s_b3 = IP3;
- addr.sin_addr.s_b4 = IP4;
-
- // host = gethostbyname ("www.baidu.com", &err);
- // addr1 = (IN_ADDR *)host->h_addr_list[0];
- //
- // addr.sin_addr.s_b1 = addr1->s_b1;
- // addr.sin_addr.s_b2 = addr1->s_b2;
- // addr.sin_addr.s_b3 = addr1->s_b3;
- // addr.sin_addr.s_b4 = addr1->s_b4;
- /* 客户端连接远程服务器,如果远程服务器还未创建,此函数会立即返回 */
- printf("新的 connect . \r\n");
-
- // sck_mode = 0;
- // ioctlsocket (sock, FIONBIO, &sck_mode);
- //
- // sck_mode = 1;
- // ioctlsocket (sock, FIO_DELAY_ACK, &sck_mode);
- //
- // sck_mode = 1;
- // ioctlsocket (sock, FIO_FLOW_CTRL, &sck_mode);
-
-
- tick1 = osKernelGetTickCount();
- res = connect (sock, (SOCKADDR *)&addr, sizeof (addr));// BSD_ETIMEDOUT
- printf_debug("connect 客户端连接远程服务器状态 res = %d. \r\n", res );
- if( res < 0 )
- {
- printf("000000000000000000000\r\n");
- closesocket (sock);
- //errcnt++;
- continue;
- }
- send(sock, http_data, strlen(http_data),0 );
- //printf("http_data = \r\n[%s] \r\n", http_data );
- res = recv (sock, dbuf, sizeof(dbuf), 0);//设置了超时
- if (res == BSD_ETIMEDOUT ) //超时了回去接着接收
- {
- printf_debug("111111111111111 = %d. \r\n", res );
- //osDelay(6000);
- closesocket (sock);
- errcnt++;
- continue;
- }
- else if( res < 0 )
- {
- printf_debug("2222222222222222222 = %d. \r\n", res );
- closesocket (sock);
- errcnt++;
- //osDelay(6000);
- continue;
- }
- else
- {
- //printf("HTTP 读取成功 . \r\n");
- cnt++;
- dbuf[ res ]= 0;
- //printf("Receive Data Length = %d ,cnt = %d, dbuf = [%s]. \r\n ", res ,cnt,dbuf );
- tick2 = osKernelGetTickCount();
- tick2 = tick2 - tick1;
- printf("#########################= %d ms \r\n", tick2 );
- tick1 = osKernelGetTickCount();
-
- closesocket (sock);
- tick2 = osKernelGetTickCount();
- tick2 = tick2 - tick1;
- printf("------%d---------------- = %d ms\r\n", i++, tick2 );
- }
- printf("结束一次cnt = %d, errcnt = %d \r\n",cnt , errcnt );
- // tick2 = osKernelGetTickCount();
- // tick2 = tick2 - tick1;
- }
- }
- /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
复制代码
|
|