【朝花夕拾】RT1170 LWIP socket client demo

一,文档描述

最近有客户想要一个RT1170 LWIP socket client的代码,但是实际做下来总是遇到一些问题,所以小编自己在SDK的基础上做了一个简单的例程,并分享出来。

二,代码修改

代码平台:
MIMXRT1170-EVKB
SDK_2_13_1_MIMXRT1170-EVKB
MCUXpresso IDE v11.7.1
代码基于SDK工程lwip_ping_freertos_cm7.
这个代码本身已经添加了socket的相关文件,所以修改起来很简单,只需要添加socket的相关头文件,还有应用任务皆可。
在原有代码基础上:
添加socket服务器地址,端口,以及发送信息。

#define INIT_THREAD_STACKSIZE 1024
/*! @brief Priority of the temporary lwIP initialization thread. */
#define INIT_THREAD_PRIO DEFAULT_THREAD_PRIO
#define   HOST_NAME       "192.168.0.100"
#define BUF_LEN  100
uint8_t senddata[]= "Socket client test";
#define PORT            54321
#define IP_ADDR        "192.168.0.100"

屏蔽stack_init中ping的调用:

//  ping_init(&netif_gw);

添加 socketclient线程:

sys_thread_new("socketclient", socketclient_thread, NULL, DEFAULT_THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);

线程函数如下:

static void socketclient_thread(void *arg)
{
	  int sock = -1,rece;
	  struct sockaddr_in client_addr;

	  char* host_ip;
	  ip4_addr_t dns_ip;
	  err_t err;

	  uint32_t *pSDRAM= pvPortMalloc(BUF_LEN);//
	    host_ip = HOST_NAME ;
	    PRINTF("host name : %s , host_ip : %s\r\n",HOST_NAME,host_ip);

		//  while(1)
		//  {
			  PRINTF("Start server Connect !\r\n");
			   // create connection
		       sock = socket(AF_INET, SOCK_STREAM, 0);
		       if (sock < 0)
		       {
		         PRINTF("Socket error\n");
		         vTaskDelay(10);
		      //   continue;
		        }
		       client_addr.sin_family = AF_INET;
		       client_addr.sin_port = htons(PORT);
		       client_addr.sin_addr.s_addr = inet_addr(host_ip);
		       memset(&(client_addr.sin_zero), 0, sizeof(client_addr.sin_zero));


		       if (connect(sock, (struct sockaddr *)&client_addr,  sizeof(struct sockaddr)) == -1)
		       {
		          PRINTF("Connect failed!\r\n");
		          closesocket(sock);
		          vTaskDelay(10);
		         // continue;
		       }

		       PRINTF("Connect to server successful!\r\n");

		       //  PRINTF("\r\n************************************************************\n\r");
		       //  PRINTF("\r\n Begin write\n\r");
		       write(sock,senddata,sizeof(senddata));
		       while (1)
		       {
			      //receive data
		          rece = recv(sock, (uint8_t*)pSDRAM, BUF_LEN, 0);//BUF_LEN
		          if (rece <= 0)
		            break;

		          PRINTF("recv %d len data\r\n",rece);
		          PRINTF("%.*s\r\n",rece,(uint8_t*)pSDRAM);
		          write(sock,pSDRAM,rece);

		       }
		       //rec data process
		       memset(pSDRAM,0,BUF_LEN);
		       closesocket(sock);
		    vTaskDelay(10000);//about 10s //10000
		 // }

}

三,测试结果

首先使用电脑配置以太网IP为服务器IP:
192.168.0.100

在这里插入图片描述配置好之后,结合测试软件USR-TCP232-Test, 配置成 TCP server,local IP为:192.168.0.100, host port为:54321,进入侦听模式:
在这里插入图片描述

代码运行起来之后,可以看到服务器这边可以检测到客户端的IP为192.168.0.102, 连接成功后,client会发送一个socket client test信息。
然后可以接收主机发送来的信息打印到串口,并且把收到的信息再回传给服务器。

代码:evkbmimxrt1170_lwip_socket_client_freertos_cm7.7z

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lwip是一个轻量级的TCP/IP协议栈,用于嵌入式系统中。它提供了一套API,可以用于在嵌入式设备上进行网络通信。其中,socketlwip中用于进行网络通信的接口之一。 在lwip中,可以使用select函数来实现多路复用,即同时监听多个socket的可读、可写和异常事件。通过select函数,可以在有多个客户端连接时,同时处理多个连接。 根据引用\[1\]中提供的客户端和服务器流程图,可以看出,在lwip中,客户端和服务器之间的通信流程如下: 1. 服务器创建socket,并绑定到指定的IP地址和端口号。 2. 服务器调用listen函数,开始监听客户端的连接请求。 3. 客户端创建socket,并调用connect函数,向服务器发起连接请求。 4. 服务器调用accept函数,接受客户端的连接请求,并创建一个新的socket用于与该客户端进行通信。 5. 服务器使用select函数来监听多个socket的可读事件。 6. 当有客户端发送数据时,服务器通过recv函数接收数据。 7. 服务器处理接收到的数据,并通过send函数向客户端发送响应数据。 8. 客户端使用select函数来监听服务器的响应数据。 9. 当服务器发送响应数据时,客户端通过recv函数接收数据。 10. 客户端处理接收到的数据,并继续发送请求或关闭连接。 根据引用\[2\]和引用\[3\]中提供的信息,可以看出,在使用lwipsocket编程中,可以通过正确的关闭socket来解决服务器阻塞在recv函数处的问题。同时,对于多个客户端连接一台机器的情况,可以采取关闭socket禁止其他连接进来的做法,以避免寄存器的读写互斥问题。 综上所述,lwipsocket编程中可以使用select函数实现多路复用,同时处理多个客户端连接。通过正确关闭socket和限制连接数量,可以解决服务器阻塞和读写互斥的问题。 #### 引用[.reference_title] - *1* *2* [LWIP学习之Socket(应用篇)](https://blog.csdn.net/m0_46577050/article/details/121992022)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [LwIPsocket应用--WebServer和Modbus TCP](https://blog.csdn.net/weixin_42131861/article/details/113009586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值