在远程主机启动连接之前,您不能将数据发送到远程主机。那没有任何意义。我的问题是:您希望您的设备连接到远程主机,还是希望远程主机启动与您的设备的连接?
现在您正在设备中使用 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; //注意这是毫秒 - lwip 在毫秒内工作
//这个循环直到连接关闭
while(!ERR_IS_FATAL(pxNewConnection->err)) { //致命错误包括连接被关闭、重置、中止等
//此 netconn_recv 调用现在将等待 10ms 等待任何新数据,然后返回
if ((pxRxBuffer = netconn_recv (pxNewConnection)) != NULL) {
//处理接收到的数据
}
//在这里,做任何你想要的传输
} //上面的while循环结束
该代码将允许您同时进行传输和接收,而不必担心阻塞。