LwIP - netconn API - 在进程被阻止时发送TCP数据包?

eep*_*pty 7 embedded voip network-programming lwip freertos

我正在使用FreeRTOS + LwIP开发基于以太网的床边护士呼叫设备.在阅读了一些示例和文档后,我想使用LwIP的netconn API在TCP下发送和接收数据,因为我不熟悉BSD样式API,原始API可能很难.

我知道该netconn_accept()函数将阻止进程,直到来自远程主机的连接请求到达,并且该netconn_recv()函数还将在等待数据到达时阻止进程...这两个函数都将阻止进程,这对服务器有利然而,接收数据时,我的设备还需要充当客户端,当患者按下按钮时需要触发对护士中心的"呼叫".那么在它还在等待远程主机的连接(阻塞进程)时,它如何启动发送TCP数据包呢?

我需要发送TCP,因为我必须使用SIP(会话启动协议)来发起呼叫,它应该是可靠的,因为它是一个医疗设备.非常感谢你


@Kyle Heironimus,@ werewindle我将你添加到我的问题中,因为我知道你有LwIP的经验,希望不会给你带来不便,希望你能提供帮助,谢谢.

小智 7

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

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

因此,该故事的寓意是,当没有连接时,您无法发送任何数据,并且在发送数据之前等待连接.您不希望等待连接,因此您必须更改软件以启动连接,而不是等待另一方启动它.

您可能遇到的另一个问题是您希望能够同时在同一连接上发送和接收数据.我看到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; // note这是毫秒 - lwip工作在ms

//这将循环,直到连接关闭

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

//此netconn_recv调用现在将等待10ms以获取任何新数据,然后返回

if((pxRxBuffer = netconn_recv(pxNewConnection))!= NULL){

//处理收到的数据

}

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

} //从上面结束while循环

该代码将允许您同时进行传输和接收,而无需担心阻塞.