物联网之轻量级TCP/IP协议栈——Lwip

简介

Lwip为轻量级的Tcp/IP协议栈,对于嵌入式设备资源比较友好,占用RAM低,基本上物联网wifi芯片都会集成此协议栈到SDK中,其位于OSI的传输层。熟悉socket编程的能够很快上手进行网络通信编程。

编程使用

TCP

TCP为面向连接的通信方式,只有客户端与服务端建立连接后才能进行正常通信,且具有响应与误包重发机制,对于消息传输准确性比较高的时候可以使用此方式,当然这些机制保障提高数据通信准确性的同时,传输的速度与效率就会有所降低,对于实时大数据传输比较不友好。其整个通信过程如同打电话,如下过程:

            A 要打电话给 B ,那么必须要知道B的电话号码,这个号码就如果TCP连接中的服务端IP与端口号,
            拨通电话必须需要此时的B在电话前面监听电话的到来,否则肯定是打不通的,这类似TCP通信服务端的监听IP与某个端口号是否有客户端的连接
            假设此时B在电话前面,且正常拿起了电话接听,那么这个通信就已经正常连接了,此后就可以进行数据传输了。

头文件调用:
#include <lwip/inet.h>
#include <lwip/sockets.h>

TCP服务端:

          1、创建SOCKET
                 server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); 
          2、绑定IP与端口
                struct sockaddr_in saddr;
                saddr.sin_family  = AF_INET;
                saddr.sin_port   = htons(50000);  ///主机字节转化为网络字节 短整型,网络字节时大端
                saddr.sin_addr.s_addr = htonl(INADDR_ANY); ///主机字节转化为网络字节 短整型
                bind(server_fd, (struct sockaddr *)&saddr, sizeof(struct sockaddr_in));//绑定
          3、监听
                listen(server_fd, 1);//连接的最大数量
          4、等待连接
                socklen = sizeof(saddr);
                client_fd = accept(server_fd, (struct sockaddr *)&saddr, &socklen);
           5、读写
                recv(client_fd, rev_buf, sizeof(rev_buf), 0);
                send(client_fd, send_buf, sizeof(send_buf), 0);

TCP客户端:

              1、创建SOCKET
                 client_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); 
               2、连接服务端
                char *server_ip_str = "127.0.0.1";
                int  server_port = 60000;
                struct sockaddr_in server_addr;
                server_addr.sin_addr.s_addr = inet_addr(server_ip_str);	
                server_addr.sin_family = AF_INET;
	        server_addr.sin_port = htons(server_port);
                connect(client_fd ,(struct sockaddr*)&server_addr,sizeof(server_addr));
               3、读写
                 recv(client_fd, rev_buf, sizeof(rev_buf), 0);
                 send(client_fd, send_buf, sizeof(send_buf), 0);

UDP

udp发送消息不保证消息是否发送成功,不需要与服务端进行连接,只要给定IP与端口号直接发送。如同快递,寄件人只要知道收件人的地址即可,至于这个邮件是否能成功邮寄到收件人手中受具体的环境因素影响。不过UDP对于实时通信比较友好,没有应答等机制资源消耗,对于即时通信一般都是在UDP的基础上加上一层数据的校验协议。

 1、创建socket
       udp_fd= socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); 
 2、绑定
       如tcp
 3、接收
       rev    
       rev_from   可以获得发送者的ip等信息
 4、发送
      sendto       在send基础上加一个 struct sockaddr_in server_addr参数,即需要发送的对象IP与端口信息

猜你喜欢

转载自blog.csdn.net/tulongyongshi/article/details/106788013
今日推荐