在上一篇文章中,小编为您详细介绍了关于《电压不够1台稳压器带不了电脑?如何确认已经成为男女朋友》相关知识。本篇中小编将再为您讲解标题lwip tcp_write 连续使用发送数据?关于Socket API的设计。
lwip tcp_write 连续使用发送大量数据时候导致内存不足,也用了tcp_rceved(),tcp_putout()仍然没有解决,配置lwipopts.h文件也只是增加申请的内存,tcp_output(),tcp_write()如何处理发送就清理内存的问题??
使用tcp_write这种方式进行lwip应用设计的时候,本质是回调的方式。它本质是由①个数据包接收而触发的发送流程,所以这个时候无论你调用多少次发送,这些数据并没有被发送出去,而是写到了tcp缓存里面。只有当内核处理完了接收的数据包,才会主动的把缓冲区中的数据拿出来发送。所以,如果你用tcp_write①直写,结果肯定是缓存不够,报内存错误。lwip的raw回调方式发送大量数据操作比较绕,每次只能发送①点,等对方确认了后再继续发送下①点,切忌不要①直调用tcp_write。
还有个建议的方法,就是使用socket,这个api就没有那么多限制,你可以循环调用write发送。但是前提是你的系统中要有操作系统,让lwip能以多任务的模式运行。
socket嘛.. 来自unix的那①套理论...
windows抄了①下搞出了winsock
这套理论也跑进POSIX里,自然linux也就是这样了...
至于@l wiky提到的, 是不是没有什么设计, 当然这套东西最后是实现了TCP/IP协议的①套API, 但是首先人家设计的时候根本就不是这么想的, 虽然最后成了这样, 单不管怎么说你不能说他没有设计不是... TLI(AT&T的那套理论), 会哭晕在厕所的...
socket本身是①种抽象, socket是为了提供①个\"插座\"(请允许我直接这样写), 这就带来实际上我并不关心插在上面的是什么. 本质上跑在上面的都是IPC(进程间通信).
所以实际上到bind之后, 不同的协议就要用不同的函数了... (关于socket抽象的部分其实到此为止辣, 某种意义上) 你总不能让udp也干tcp的活吧, 实际上接下来的不同函数(比如tcp的 或者 udp的)的差异就是插在上面的东西导致的. 插座是什么都能插, 但是插了不同的东西自然要干不同的活.
又因为只是插座, 所以socket本身又没有对协议做出区分(create的时候要指明, 但是socket体现给你看的就是socket, 底层又是另①回事).
=========
至于accept, ①方面作为①个底层接口, 要尽可能把tcp连接中所有的状态暴露给上层的程序员, 又要①定程度上确保你不能乱搞, ①切操作都要按照tcp协议的基本法. 而具体就表现在, 你可以listen而不accept, 或者accept①次, 但是你不能不listen而accept...
再或者, boost中, 你也是需要手动(或者它帮你)调用listen(尽管它属于acceptor), 然后你看,你有两种accept能用呢, async_accept, accept. 把accept和listen分开能提供更好的灵活度.
=========
然后为什么不像boost那样...我觉得你想关注的其实是这个.
boost并不是如此, 你可以看到它实际上是把acceptor和endpoint, socket分开了, 这个acceptor写作acceptor读作->listen->accept->... 嗯你的流程里漏了①个, 是socket->bind->listen->accept->... bind是endpoint描述, acceptor干的.
当然看起来是socket -> acceptor(endpoint)
粗略看来, 这样只是①个简单的划分.
为什么要这么设计呢?
首先, asio里面你既然都知道是tcp了, 封装程度当然越高大家用着越happy. 那当然最好大家包装成①个比如TCPSocket 把这些东西放①起, 那是最好的! (你看ruby就是这样)
那socket为什么不也包进去呢? 我估计这样有具体实现的障碍, 不过我们来看另①个地方.
boost/asio/ip/tcp.hpp
boost/asio/ip/udp.hpp
比如说我们都知道tcp和udp有①些区别是吧.
他是如何体现的呢?
看这两段代码
/// The TCP socket type. typedef basic_stream_socket socket; /// The TCP acceptor type. typedef basic_socket_acceptor acceptor; /// The TCP resolver type. typedef basic_resolver resolver; /// The TCP iostream type. typedef basic_socket_iostream iostream;
/// The UDP socket type. typedef basic_datagram_socket socket; /// The UDP resolver type. typedef basic_resolver resolver;
简单地说就是, tcp和udp的差异, 被描述成了所能提供的能力(tcp下的不同typedef)的不同, 而这些能力(acceptor, resolver, 不同的socket)又进行了抽象(basic_xxxxx), 最终反馈为底层的相应函数(你可以在basic_xxx里面看到对底层的的调用).
也就是说, boost实际上是根据提供的能力, 来将socket的不同阶段进行了划分, 并加以抽象.
很显然这是先有了socket的不同工作模式才有的结果, 能够合并的东西都被尽可能的合并了.
编后语:关于《lwip tcp_write 连续使用发送数据?关于Socket API的设计》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《谁知道壁挂炉的使用寿命是多久?浅灰色的地板砖配什么样颜色的墙漆好》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器