Чтобы получать пакеты в необработанном сокете, просто наберите recv
или recvfrom
на нем.ОС вернет вам копию следующего пакета, адресованного машине, с заголовками и всем, что должно включать информацию об адресе.Следите за адресом назначения, портом и транспортным протоколом и игнорируйте все, что не соответствует вашим ожиданиям.(Поскольку точка необработанного сокета заключается в том, что отсутствует встроенное понятие портов или чего-либо еще, что операционная система могла бы использовать для маршрутизации пакетов в сокеты, она не знает, в какую программу отправлять ее ... поэтому каждый необработанный сокет должен получатькаждый пакет адресован машине. Это означает, что вы можете получить много дерьма, которое вас не интересует.)
Как только вы увидите пакет, адресованный «вам», просто создайте пакет SYN / ACK и отправьте егоадрес и порт, указанные в качестве источника в полученном пакете.
Обратите внимание, однако: ОС часто выполняет свою собственную обработку пакетов TCP и UDP (включая отправку ICMP "порта недоступен" или других ответов для портов, которые она не делает.у меня нет слушателей) ... и выполнение вашей собственной обработки, помимо всего прочего, неизбежно вызовет дурачество.Если вы собираетесь реализовать свой собственный вариант протокола TCP, вы можете использовать другой номер протокола.(Конечно, тогда большинство клиентов не смогут подключиться к нему ... вам также придется сделать клиента.)