【问题标题】:LwIP - netconn API - Send a TCP packet while the process is blocked?LwIP - netconn API - 在进程被阻塞时发送 TCP 数据包?
【发布时间】:2012-05-03 11:34:00
【问题描述】:

我正在使用 FreeRTOS + LwIP 开发基于以太网的床边护士呼叫设备。看了一些例子和文档,想用LwIP的netconn API在TCP下收发数据,因为我不熟悉BSD风格的API,原始API可能比较难。 p>

我知道netconn_accept() 函数会阻塞进程,直到来自远程主机的连接请求到达,而netconn_recv() 函数也会在等待数据到达时阻塞进程...这两个函数都会 block 这个过程,这对服务器接收数据有好处,但是,我的设备还需要充当客户端,当患者按下按钮时,它需要触发对护士中心的“呼叫”。 那么它如何在等待来自远程主机的连接(阻塞进程)的同时发起发送 TCP 数据包呢?

我需要发送 TCP,因为我必须使用 SIP(Session Initiation Protocol) 来发起呼叫,它应该是可靠的,因为它是一个医疗设备。非常感谢


@Kyle Heironimus , @werewindle 我知道你在 LwIP 方面有经验,所以我将你添加到我的问题中,希望不会给你带来不便,希望你能提供帮助,谢谢。

【问题讨论】:

  • 由于我使用的是FreeRTOS,今天我尝试使用两个线程,一个作为服务器等待连接,另一个作为客户端在需要时打开TCP连接。服务器线程运行良好,但在客户端,当我调用netconn_connect() 时它总是返回错误...我尝试为服务器和客户端使用相同和不同的端口,但仍然失败
  • 请帮我解决这个问题,stackoverflow.com/questions/51112786/…

标签: network-programming embedded voip freertos lwip


【解决方案1】:

在远程主机发起连接之前,您不能将数据发送到远程主机。那没有任何意义。我的问题是:您希望您的设备连接到远程主机,还是希望远程主机启动与您的设备的连接?

现在您正在设备中使用 netconn_accept - 这意味着您正在等待远程主机启动与您的设备的连接,然后您的设备才能向远程主机发出信号。对于您编写的代码,这完全是预期的行为,但您似乎对此感到担忧。这不是你的本意吗?如果不是,你为什么要这样编码?另一种选择是让您的设备启动与远程主机的连接。有一个使用 netconns here 的例子。当然,这也涉及对系统中其他设备的更改。

所以这个故事的寓意是,当没有连接时,您无法发送任何数据,并且您在发送数据之前正在等待连接。您不想等待连接,因此您必须更改软件以启动连接,而不是等待对方启动它。

您可能遇到的另一个问题是您希望能够同时在同一连接上发送和接收数据。我看到的关于 lwip 的大多数示例都涉及阻塞等待数据的调用,然后通过回传某些内容来对该数据做出反应。有时您想在没有先接收到某些内容的情况下将某些内容传回。我也可以帮忙。

当我创建监听 netconn 连接时,这对我有用。

首先,您必须通过设置来启用超时:

#define LWIP_SO_RCVTIMEO 1

然后你必须像这样设置你的netconn:

pxTCPListener = netconn_new (NETCONN_TCP);

netconn_bind (pxTCPListener, NULL, 23);

netconn_listen (pxTCPListener);

pxNewConnection = netconn_accept (pxTCPListener); //这会阻塞直到连接被接受

//这是重要的一行!

pxNewConnection->recv_timeout = 10; //注意这是毫秒 - lwip 在毫秒内工作

//这个循环直到连接关闭

while(!ERR_IS_FATAL(pxNewConnection->err)) { //致命错误包括连接被关闭、重置、中止等

//这个 netconn_recv 调用现在将等待 10ms 等待任何新数据,然后返回

如果 ((pxRxBuffer = netconn_recv (pxNewConnection)) != NULL) {

//处理接收到的数据

}

//在这里,做任何你想要的传输

} //上面的while循环结束

该代码将允许您同时进行传输和接收,而不必担心阻塞。

【讨论】:

  • 谢谢斯蒂芬,护士呼叫设备将充当服务器,等待连接,
  • 是的……这是为什么呢?似乎呼叫设备应该启动与服务器的连接,因为触发所有这一切的操作是有人在其上按下按钮,而不是等待某物连接到它,以便它可以告诉它按下了按钮。
  • 非常感谢斯蒂芬的详细回答。该设备就像一部手机,它正常等待连接,充当服务器,但如果有人按下它的按钮,它就会发起连接,充当客户端。这两种情况不会同时存在,两种情况都涉及接收和发送。最近我成功地分别实现了这两个任务..经过长时间阅读......我在FreeRTOS中将它们分成两个不同的任务,启用一个任务会阻塞另一个任务。我已经分别测试了每个任务,但没有测试它们一起运行...我是 RTOS 新手,但我会尝试
  • Hey Stephen, your line" while(!ERR_IS_FATAL(pxNewConnection->err)) 帮了我很多。因为虽然我之前可以接收和发送,但是我需要为每次接收连接和断开 TCP 连接,如果不能,程序会挂了。再次感谢您
  • 是的,这对我来说也很好。全双工通信的例子并不多。
猜你喜欢
  • 2012-06-06
  • 1970-01-01
  • 2013-02-20
  • 2011-07-05
  • 2015-06-12
  • 2021-06-05
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
相关资源
最近更新 更多