简介
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与端口信息