Знаете, коллеги, я убедился, что университет с мировым именем — не гарантия, что вас не научат индийскому программированию.
Сдаю в бумажном виде госы.
— И где же у вас здесь протокол SMTP?
— Вот это всё — реализация. Вот список команд, вот список кодов ответов…
— Так, где создаётся сокет?
Тыкаю пальцем: server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
— Та-а-ак! Но у вас же здесь TCP!
— Правильно. SMTP — протокол слоя приложения. А при создании сокета указывается транспортный.
— А как тогда отличить, что ваша программа работает про протоколу SMTP? Где это написано?
— По структуре заголовка пакета — никак. По порту разве что.
Показываю на строчку: addr.sin_port = htons(IPPORT_SMTP);
— О! Так вот эта константа. Но она должна быть в протоколе.
— Нет, она должна быть здесь. Даже по имени константы видно, что в протокол она не лезет. Давайте покажу на практике, попробуем подставить эту константу туда и запустить — получим INVALID_SOCKET.
— Так! Что ты тут со мной споришь? В книге было написано, что должен быть IPPORT_SMTP, и прилагались рабочие примеры!
— Покажите, пожалуйста.
— Нету, книга в библиотеке.
— Тогда давайте сейчас покажу на практике, — поворачиваюсь к ближайшей машине, — что моя программа работает. Заодно попробуем туда подставить этот IPPORT…
— Так, иди переделывай.
Позже дома проверил — действительно, сокет не создаётся, если подставить туда любую константу портов. Повторная попытка доказать это провалилась. Пришлось в глубоком табе писать: #define IPPROTO_SMTP IPPROTO_TCP.