Вы не можете отправлять данные на удаленный хост, пока он не инициировал соединение. В этом нет никакого смысла. Мой вопрос: вы хотите, чтобы ваше устройство подключалось к удаленному хосту, или вы хотите, чтобы удаленный хост инициировал соединение с вашим устройством?
Прямо сейчас вы используете 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 теперь будет ждать 10 мсек для любых новых данных, а затем вернется
if ((pxRxBuffer = netconn_recv (pxNewConnection))! = NULL) {
// Обрабатываем полученные данные
}
// Здесь делайте любые передачи, которые хотите
} // Конец цикла while сверху
Этот код позволит вам одновременно передавать и получать, не беспокоясь о блокировке.
person
Stephen Friederichs
schedule
26.04.2012