MicroTCP - это сетевой стек TCP/IP, который я начал создавать в качестве учебного упражнения, посещая курс компьютерных сетей в Università Degli Studi Di Napoli Federico II. Это просто хобби -проект, который предназначен для того, чтобы быть минимальной, но полной реализацией.
В этот момент MicroTCP реализует ARP (RFC 826, завершен), IPv4 (без фрагментации), ICMP (минимум, необходимый для ответа на пинг) и TCP (полная, но не проверенная на стрессе). Обратите внимание, что «полное» не должно быть предназначено как «полностью совместимое», а как мера прогресса во всех основных функциях. Например, он достаточно полный для обработки HTTP -трафика в локальной сети (загляните в примеры/microhttp, чтобы узнать больше).
MicroTCP может работать в Windows и Linux вместе со стеком сети ОС. Чтобы направить сетевой трафик на MicroTCP, процесс, запускающий его, ведет себя как виртуальный хост с собственным IP -адресом. Это делается с использованием устройства для TAP, которое поставляется на Linux и необходимо установить в Windows. Должно быть очень легко адаптировать MicroTCP для запуска на микроконтроллерах, но еще не пробовал. Мечта состоит в том, чтобы обслуживать мой блог с доски STM32!
Если вы находитесь в Windows, вам необходимо установить драйвер Tap, предоставленный OpenVPN, и информировать виртуальную секунду, чтобы MicroTCP мог подключаться к нему при запуске. Чтобы построить проект из источника, убедитесь, что вы клонировали хранилище с подмодулями
git clone https://github.com/cozis/microtcp.git --recursiveа затем беги
make Вам понадобится как make , так и cmake , чтобы он работал. Если все пойдет хорошо, вы найдете файлы библиотеки libtuntap.a , libmicrotcp.a и файлы заголовка tuntap.h , tuntap-export.h , microtcp.h in out/ .
MicroTCP использует обычный интерфейс сокета, с которым знакомы, с которым знакомы, основное отличие - вам необходимо явно оснастить стек сети и передать его ручку.
Вот простой сервер Echo, который показывает основное использование:
#include <microtcp.h>
int main ( void )
{
microtcp_t * mtcp = microtcp_create ( "10.0.0.5" , "10.0.0.4" , NULL , NULL );
if ( mtcp == NULL )
return -1 ; // Couldn't create MicroTCP instance
uint16_t port = 8081 ;
microtcp_socket_t * server = microtcp_open ( mtcp , port );
if ( server == NULL ) {
microtcp_destroy ( mtcp );
return -1 ;
}
while ( 1 ) {
microtcp_socket_t * client = microtcp_accept ( server );
if ( client == NULL )
break ;
char buffer [ 1024 ];
int num = microtcp_recv ( client , buffer , sizeof ( buffer ));
if ( num > 0 ) {
microtcp_send ( client , "echo: " , 6 );
microtcp_send ( client , buffer , num );
}
microtcp_close ( client );
}
microtcp_close ( server );
microtcp_destroy ( mtcp );
return 0 ;
} Это должно быть довольно прямо, чтобы понять. Может быть, стоит отметить, что microtcp_open ведет себя как socket+bind+listen Allly для настройки прослушивания TCP -сервера.
Существует более одного способа настроить стек, основным способом является microtcp_create , который создает вывод виртуальной сети в ОС хоста с IP 10.0.0.5/24 и виртуальный хост для процесса MicroTCP на 10.0.0.4/24. Вы можете открыть Wireshark на виртуальной NIC, чтобы проверить трафик между хостом и процессом.
Также можно настроить стек с помощью microtcp_create_using_callbacks , который позволяет вам явно предоставлять входные кадры L2 и получать рамы в буфере. Вот как можно настроить стек для запуска на микроконтроллере.
Каждый экземпляр MicroTCP (без рассмотрения обратных вызовов) полностью изолирован от других, поэтому, если позволяет ваша конкретная реализация обратного вызова, вы можете иметь столько экземпляров, сколько захотите!
Там до сих пор нет тестирования инфрактруктуры. То, как я тестирую его, настройка сервера HTTP или Echo и подчеркиваю его, пока что -то не сломается, захватив то, что произошло, используя Wireshark.