lwip 低级、连续、高级 socket编程介绍

本文介绍了Lwip网络编程的三种主要方式:基于回调的raw API、协议栈API(sequential API)及BSD API。详细解释了不同API的使用场景与特点,并探讨了TCP数据发送的多种选项。
原文链接:http://blog.youkuaiyun.com/yangzhao0001/article/details/48626919

今天看书,忽然发现对于lwip来说,使用BSD socket编程,对于嵌入式系统来说,是一种低效的方式,但是胜在简单、移植性好。


1、使用raw/callback API编程,用户编程的方法是向内核注册各种自定义的回调函数,回调函数是与内核实现交换的唯一方式。

recv_udp, accept_function, sent_tcp, recv_tcp, do_connected, poll_tcp, err_tcp!


2、协议栈API(sequential API)是基于raw/callback API实现的,它与内核交换的方式也只能通过回调。

netconn_new, netconn_delete, netconn_getaddr, netconn_connect, netconn_disconnect, netconn_listen, netconn_accept,

netconn_recv, netconn_send, netconn_write, netconn_close

注: netconn_send 是给UDP使用的。

netconn_write是给TCP使用的。但是tcp发送时,有三种选择:

(1)NETCONN_COPY 标志告诉协议栈将待发送数据拷贝到内核进程所属的内存空间,在这种情况下,会消耗系统的部分时间和内存资源,但是用户进程

可以在向内核提交数据后立即重新使用这些数据区域,甚至删除这些区域,而不必等待内核是否完全正确发送。如果用户没有设置该位,则内核构造发送

数据包是,会引用这些发送数据的内存区域,在这种情况下,用户进程不能再对这些数据进行修改,这种方式通常用在静态数据(ROM数据)的发送中。

对于非ROM数据的发送,用户应尽量设置NETCONN_COPY标志。

(2)NETCONN_MORE标志,当其置位时,组装这些数据的最后一个TCP报文段首部PSH标志将被设置,这样,数据在接收端将被尽快的递交给上层,而不会缓冲等待。


3、BSD API(或者说 SOCKET API),是Lwip设计者对sequential API函数进行了简单封装后的函数。

socket、bind、connect、listen、accept、sendto、write、recvfrom、read、close。

sendto、recvfrom:主要用于UDP,但是也可用于TCP。

write、read:主要用于TCP,但是也可用于UDP



版权声明:本文为博主原创文章,转载请注明出处。
### lwIP Socket 编程 API 文档与教程 #### 一、lwIP 的两种主要 API 接口概述 lwIP 提供了 Sequential API 和 RAW API 两种应用编程接口用于与 TCP/IP 协议栈交互[^1]。其中,Socket API 构建于 Sequential API 上面,旨在保持与其他平台(如 Unix/Windows)上的套接字 API 兼容性,以便移植已有应用程序到嵌入式环境中[^2]。 #### 二、Socket API 特点 尽管力求兼容,但由于 lwIP 自身特性和资源限制的原因,在某些情况下仍需对原有代码做出适当调整以适应新的环境需求。对于大多数开发者来说,使用基于 NETCONN 的高层抽象——即 Socket 或者 Netconn API 来开发网络应用会更加便捷高效[^3]。 #### 三、获取官方文档及学习资料的方法 为了更好地理解和掌握 lwIP 中的 Socket 编程技巧,建议访问 lwIP 官方网站下载最新版本的手册和指南。此外,GitHub 上也有很多开源项目提供了丰富的实例代码可供参考学习。同时也可以查阅 STM32CubeMX 集成开发工具附带的帮助文件中的相关内容,因为很多微控制器厂商都会针对自家产品定制化集成 lwIP 并给出详细的说明文档。 ```c // 创建一个新的TCP连接并监听端口8080 struct sockaddr_in addr; int sockfd, new_sockfd; sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sockfd < 0) { perror("socket"); } memset(&addr, '\0', sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(8080); bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); listen(sockfd, 5); // 设置最大等待队列长度为5 new_sockfd = accept(sockfd, NULL, NULL); // 接受客户端请求建立新连接 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值