lwip tcp_write 连续使用发送数据?关于Socket API的设计

发表时间:2018-01-25 15:24:02 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《电压不够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的设计》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《谁知道壁挂炉的使用寿命是多久?浅灰色的地板砖配什么样颜色的墙漆好》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题