Alexander V. Ribchansky
New member
Добрый день!
Во-второй раз поднимаю вопрос проблемы реализации встроенного веб-сервера. Симптомы такие, что в локальной сети, встроенный веб-сервер нормально отдает странички, отдает файлы иже с ним. Но стоит попробовать получить доступ из-за нат-а, через проброс портов - веб-сервер нормально отдает только маленькие странички или небольшие json-ответы. То есть даже страницы из примера Meteocotrol уже НЕ отдаются. Как верно в прошлый раз заметил тов pvvx, это может быть из-за сырости реализации HTTP-протокола встроенным веб-сервером. А именно он не отдает заголовок Content-Length и/или не умеет отправлять поток данных в "нарезку" используя Transfer-Encoding: chuncked. Я пробовал "хачить" TcpConnection::write
приблизительно таким методом, и из HttpResponse выставлять заголовок TransferEncoding: chuncked и оно даже почти работать стало в ЛОКАЛКЕ, но через нат+портфорвардинг+инет - те же грабли. Грязные попытки анализа трафика привели к тому, что стало ясно, что не смотря на нарезку, пакеты сперва заполняют весь MSS 1460, а только потом шлются..А надо, чтоб каждый HTTP-кусок шел своим пакетом как я понимаю.
Вообщем может есть кто, кто более хорошо въезжает в тонкости LWIP+Sming+HTTP чтоб пофиксить это и довести реализацию HTTP до минимально рабочего через инет состояния? или хотя бы пните КАК сделать так, чтоб не дожидаясь заполнения ПОЛНОГО MSS 1460 отправлять пакет??
Спасибо!
Во-второй раз поднимаю вопрос проблемы реализации встроенного веб-сервера. Симптомы такие, что в локальной сети, встроенный веб-сервер нормально отдает странички, отдает файлы иже с ним. Но стоит попробовать получить доступ из-за нат-а, через проброс портов - веб-сервер нормально отдает только маленькие странички или небольшие json-ответы. То есть даже страницы из примера Meteocotrol уже НЕ отдаются. Как верно в прошлый раз заметил тов pvvx, это может быть из-за сырости реализации HTTP-протокола встроенным веб-сервером. А именно он не отдает заголовок Content-Length и/или не умеет отправлять поток данных в "нарезку" используя Transfer-Encoding: chuncked. Я пробовал "хачить" TcpConnection::write
Код:
int TcpConnection::write(IDataSourceStream* stream, bool chunked)
{
// Send data from DataStream
bool repeat;
bool space;
int available;
int total = 0;
char buffer[NETWORK_SEND_BUFFER_SIZE];
do
{
space = (tcp_sndqueuelen(tcp) < TCP_SND_QUEUELEN);
if (!space)
{
debugf("WAIT FOR FREE SPACE");
flush();
break; // don't try to send buffers if no free space available
}
// Join small fragments
int pushCount = 0;
do
{
pushCount++;
int read = min(NETWORK_SEND_BUFFER_SIZE, getAvailableWriteSize());
if (read > 0)
available = stream->readMemoryBlock(buffer, read);
else
available = 0;
if (available > 0)
{
if (chunked)
{
char cbuf[16];
unsigned int len = os_sprintf(cbuf,"%X\r\n", available);
write(cbuf, len, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE);
}
int written = write(buffer, available, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE);
if (chunked)
{
write("\r\n", 2, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE);
}
total += written;
stream->seek(max(written, 0));
repeat = written == available && !stream->isFinished() && pushCount < 25;
}
else
repeat = false;
} while (repeat);
space = (tcp_sndqueuelen(tcp) < TCP_SND_QUEUELEN);// && tcp_sndbuf(tcp) >= FILE_STREAM_BUFFER_SIZE;
} while (repeat && space);
if (chunked)
{
write("0\r\n\r\n", 5, TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE);
}
flush();
return total;
}
приблизительно таким методом, и из HttpResponse выставлять заголовок TransferEncoding: chuncked и оно даже почти работать стало в ЛОКАЛКЕ, но через нат+портфорвардинг+инет - те же грабли. Грязные попытки анализа трафика привели к тому, что стало ясно, что не смотря на нарезку, пакеты сперва заполняют весь MSS 1460, а только потом шлются..А надо, чтоб каждый HTTP-кусок шел своим пакетом как я понимаю.
Вообщем может есть кто, кто более хорошо въезжает в тонкости LWIP+Sming+HTTP чтоб пофиксить это и довести реализацию HTTP до минимально рабочего через инет состояния? или хотя бы пните КАК сделать так, чтоб не дожидаясь заполнения ПОЛНОГО MSS 1460 отправлять пакет??
Спасибо!