реклама на сайте
подробности

 
 
> lwip netconn - как не закрывать соединение?, И как понять что оно еще не закрыто?
-= Александр =-
сообщение Jan 15 2018, 14:38
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 123
Регистрация: 15-10-07
Из: Санкт-Петербург
Пользователь №: 31 370



Добрый день!
Недавно начал ковырять lwip на stm32. Задачка сделать сервер, получать от клиента данные и отправлять ему что-то в ответ.

Во всяких примерах сделано просто - дождались коннекта, прочитали "GET /", выслали строку и закрыли соединение. Вот код примера, он работает.

CODE
conn = netconn_new(NETCONN_TCP);

if (conn!= NULL)
{
/* Bind to port 80 (HTTP) with default IP address */
err = netconn_bind(conn, NULL, 80);

if (err == ERR_OK)
{
/* Put the connection into LISTEN state */
netconn_listen(conn);

while(1)
{
/* accept any icoming connection */

if(newconn->state != NETCONN_CONNECT) err = netconn_accept(conn, &newconn);

if(err == ERR_OK)
{
res = netconn_recv(newconn, &inbuf);
if (res == ERR_OK)
{
netbuf_data(inbuf, (void**)&buf, &buflen);
if ((buflen >=5) && (strncmp(buf, "GET /", 5) == 0))
{
sprintf(data, "Hello %d times!", call_times++);
len = strlen(data);
netconn_write(newconn, (const unsigned char*)(data), (size_t)len, NETCONN_NOCOPY);
}
}

/* Close the connection (server closes in HTTP) */
netconn_close(newconn);

/* Delete the buffer (netconn_recv gives us ownership,
so we have to make sure to deallocate the buffer) */
netbuf_delete(inbuf);

/* delete connection */
netconn_delete(newconn);
}
}
}
else
{
printf("can not bind netconn");
}
}
else
{
printf("can not create netconn");
}


Мне по-сути надо то-же самое, но соединение не закрывать, а ждать дальнейших данных. Добавил цикл в чтение с выходом по ошибке

CODE
conn = netconn_new(NETCONN_TCP);

if (conn!= NULL)
{
/* Bind to port 80 (HTTP) with default IP address */
err = netconn_bind(conn, NULL, 80);

if (err == ERR_OK)
{
/* Put the connection into LISTEN state */
netconn_listen(conn);

while(1)
{
/* accept any icoming connection */

if(newconn->state != NETCONN_CONNECT) err = netconn_accept(conn, &newconn);

if(err == ERR_OK)
{
do
{
res = netconn_recv(newconn, &inbuf);
if (res == ERR_OK)
{
netbuf_data(inbuf, (void**)&buf, &buflen);
if ((buflen >=5) && (strncmp(buf, "GET /", 5) == 0))
{
sprintf(data, "Hello 80 %d times!", call_times++);
len = strlen(data);
netconn_write(newconn, (const unsigned char*)(data), (size_t)len, NETCONN_NOCOPY);
}
}
}
while (res == ERR_OK);

/* Close the connection (server closes in HTTP) */
netconn_close(newconn);

/* Delete the buffer (netconn_recv gives us ownership,
so we have to make sure to deallocate the buffer) */
netbuf_delete(inbuf);

/* delete connection */
netconn_delete(newconn);
}
}
}
else
{
printf("can not bind netconn");
}
}
else
{
printf("can not create netconn");
}


По задумке на каждый запрос "GET /" должен возвращать строку и ждать следующую посылку. В реальности же работает один раз и дальше вылетает из netconn_recv с ошибкой -1. Даже реконнект не помогает. Что я делаю не так?

И дальше вопрос: как определить, отконнектился клиент или еще висит? netconn_state всегда NONE, оттуда состояние коннекта не вынуть. Неужели только не коллбеках все это можно нормально сделать?

Сообщение отредактировал IgorKossak - Jan 15 2018, 15:54
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!


--------------------
Ниндзя - круче всех. Они умеют ходить по воде, делить на ноль и угадывать шаффл в АйПоде.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 13:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01338 секунд с 7
ELECTRONIX ©2004-2016