Sys socket h windows

Содержание
  1. Include sys socket h
  2. Содержание
  3. Интерфейс сокета Беркли [ править | править код ]
  4. Заголовочные файлы [ править | править код ]
  5. Структуры [ править | править код ]
  6. Функции [ править | править код ]
  7. socket() [ править | править код ]
  8. Прототип [ править | править код ]
  9. gethostbyname() и gethostbyaddr() [ править | править код ]
  10. Прототипы [ править | править код ]
  11. connect() [ править | править код ]
  12. Прототип [ править | править код ]
  13. bind() [ править | править код ]
  14. Прототип [ править | править код ]
  15. listen() [ править | править код ]
  16. Прототип [ править | править код ]
  17. accept() [ править | править код ]
  18. Прототип [ править | править код ]
  19. Дополнительные параметры для сокетов [ править | править код ]
  20. Блокирующие и неблокирующие сокеты [ править | править код ]
  21. Передача данных [ править | править код ]
  22. Высвобождение ресурсов [ править | править код ]
  23. Пример клиента и сервера, использующих TCP [ править | править код ]
  24. Сервер [ править | править код ]
  25. Клиент [ править | править код ]
  26. Пример клиента и сервера, использующих UDP [ править | править код ]
  27. Сервер [ править | править код ]
  28. Клиент [ править | править код ]
  29. См. также [ править | править код ]
  30. Примечания [ править | править код ]
  31. Ссылки [ править | править код ]
  32. 4 Answers 4
  33. Принципы сокетов¶
  34. Основные функции¶
  35. socket()¶
  36. listen()¶
  37. accept()¶
  38. connect()¶
  39. Передача данных¶

Include sys socket h

Сокеты Беркли — интерфейс программирования приложений (API), представляющий собой библиотеку для разработки приложений на языке C с поддержкой межпроцессного взаимодействия (IPC), часто применяемый в компьютерных сетях.

Сокеты Беркли (также известные как API сокетов BSD) впервые появились как API в операционной системе 4.1BSD Unix (выпущенной в 1982 году) [1] . Тем не менее, только в 1989 году Калифорнийский университет в Беркли смог начать выпускать версии операционной системы и сетевой библиотеки без лицензионных ограничений AT&T, действующих в защищённой авторским правом Unix.

API сокетов Беркли сформировал фактически стандарт абстракции для сетевых сокетов. Большинство прочих языков программирования используют интерфейс, схожий с API языка Си.

API Интерфейса транспортного уровня (TLI), основанный на STREAMS, представляет собой альтернативу сокетному API. Тем не менее, API сокетов Беркли значительно преобладает в популярности и количестве реализаций.

Содержание

Интерфейс сокета Беркли [ править | править код ]

Интерфейс сокета Беркли — API, позволяющий реализовывать взаимодействие между компьютерами или между процессами на одном компьютере. Данная технология может работать со множеством различных устройств ввода-вывода и драйверов, несмотря на то, что их поддержка зависит от реализации операционной системы. Подобная реализация интерфейса лежит в основе TCP/IP, благодаря чему считается одной из фундаментальных технологий, на которых основывается Интернет. Технология сокетов впервые была разработана в Калифорнийском университете Беркли для применения на UNIX системах. Все современные операционные системы имеют ту или иную реализацию интерфейса сокетов Беркли, так как это стало стандартным интерфейсом для подключения к сети Интернет.

Программисты могут получать доступ к интерфейсу сокетов на трёх различных уровнях, наиболее мощным и фундаментальным из которых является уровень сырых сокетов. Довольно небольшое число приложений нуждается в ограничении контроля над исходящими соединениями, реализуемыми ими, поэтому поддержка сырых сокетов задумывалась быть доступной только на компьютерах, применяемых для разработки на основе технологий, связанных с Интернетом. Впоследствии в большинстве операционных систем была реализована их поддержка, включая Windows XP.

Заголовочные файлы [ править | править код ]

Программная библиотека сокетов Беркли включает в себя множество связанных заголовочных файлов.

Базовые функции сокетов BSD и структуры данных. Семейства адресов/протоколов PF_INET и PF_INET6. Широко используются в сети Интернет, включают в себя IP-адреса, а также номера портов TCP и UDP. Семейство адресов PF_UNIX/PF_LOCAL. Используется для локального взаимодействия между программами, запущенными на одном компьютере. В компьютерных сетях не применяется. Функции для работы с числовыми IP-адресами. Функции для преобразования протокольных имен и имен хостов в числовые адреса. Используются локальные данные аналогично DNS.

Структуры [ править | править код ]

  • sockaddr — обобщённая структура адреса, к которой, в зависимости от используемого семейства протоколов, приводится соответствующая структура, например:
  • sockaddr_in
  • sockaddr_in6
  • in_addr
  • in6_addr

Функции [ править | править код ]

socket() [ править | править код ]

socket() создаёт конечную точку соединения и возвращает дескриптор. socket() принимает три аргумента:

  • domain , указывающий семейство протоколов создаваемого сокета. Этот параметр задает правила использования именования и формат адреса. Например:
  • PF_INET для сетевого протокола IPv4 или
  • PF_INET6 для IPv6.
  • PF_UNIX для локальных сокетов (используя файл).
  • type (тип) один из:
  • SOCK_STREAM надёжная потокоориентированная служба (TCP) (сервис) или потоковый сокет
  • SOCK_DGRAM служба датаграмм (UDP) или датаграммный сокет
  • SOCK_SEQPACKET надёжная служба последовательных пакетов
  • SOCK_RAW Сырой сокет — сырой протокол поверх сетевого уровня.
  • protocol определяет используемый транспортный протокол. Самые распространённые — это IPPROTO_TCP , IPPROTO_SCTP , IPPROTO_UDP , IPPROTO_DCCP . Эти протоколы указаны в . Значение « 0 » может быть использовано для выбора протокола по умолчанию из указанного семейства ( domain ) и типа ( type ).

    Функция возвращает −1 в случае ошибки. Иначе, она возвращает целое число, представляющее присвоенный дескриптор.

    Прототип [ править | править код ]

    gethostbyname() и gethostbyaddr() [ править | править код ]

    Функции gethostbyname() и gethostbyaddr() возвращают указатель на объект типа struct hostent , описывающий интернет-узел по имени или по адресу, соответственно. Эта структура содержит или информацию, полученную от сервера имен или произвольные поля из строки в /etc/hosts. Если локальный сервер имен не запущен, то эти подпрограммы просматривают /etc/hosts. Функции принимают следующие аргументы:

    • name , определяющий имя хоста. Например: www.wikipedia.org
    • addr , определяющий указатель на struct in_addr , содержащую адрес хоста.
    • len , определяющий длину в байтах addr .
    • type , определяющий тип области адресов хоста. Например: PF_INET

    Функции возвращают NULL-указатель в случае ошибки. В этом случае может быть проверена дополнительная целая h_errno для выявления ошибки или неправильного или неизвестного хоста. В противном случае возвращается корректная struct hostent * .

    Прототипы [ править | править код ]

    connect() [ править | править код ]

    connect() Устанавливает соединение с сервером. Возвращает целое число, представляющее код ошибки: 0 означает успешное выполнение, а −1 свидетельствует об ошибке.

    Некоторые типы сокетов работают без установления соединения, это в основном касается UDP-сокетов. Для них соединение приобретает особое значение: цель по умолчанию для посылки и получения данных присваивается переданному адресу, позволяя использовать такие функции как send() и recv() на сокетах без установления соединения.

    Читайте также:  Каноническое имя элемента панели управления windows 10

    Загруженный сервер может отвергнуть попытку соединения, поэтому в некоторых видах программ необходимо предусмотреть повторные попытки соединения.

    Прототип [ править | править код ]

    bind() [ править | править код ]

    bind() связывает сокет с конкретным адресом. Когда сокет создается при помощи socket() , он ассоциируется с некоторым семейством адресов, но не с конкретным адресом. До того как сокет сможет принять входящие соединения, он должен быть связан с адресом. bind() принимает три аргумента:

    • sockfd — дескриптор, представляющий сокет при привязке
    • serv_addr — указатель на структуру sockaddr , представляющую адрес, к которому привязываем.
    • addrlen — поле socklen_t , представляющее длину структуры sockaddr .

    Возвращает 0 при успехе и −1 при возникновении ошибки.

    Прототип [ править | править код ]

    listen() [ править | править код ]

    listen() подготавливает привязываемый сокет к принятию входящих соединений (так называемое «прослушивание»). Данная функция применима только к типам сокетов SOCK_STREAM и SOCK_SEQPACKET . Принимает два аргумента:

    • sockfd — корректный дескриптор сокета.
    • backlog — целое число, означающее число установленных соединений, которые могут быть обработаны в любой момент времени. Операционная система обычно ставит его равным максимальному значению.

    После принятия соединения оно выводится из очереди. В случае успеха возвращается 0, в случае возникновения ошибки возвращается −1.

    Прототип [ править | править код ]

    accept() [ править | править код ]

    accept() используется для принятия запроса на установление соединения от удаленного хоста. Принимает следующие аргументы:

    • sockfd — дескриптор слушающего сокета на принятие соединения.
    • cliaddr — указатель на структуру sockaddr , для принятия информации об адресе клиента.
    • addrlen — указатель на socklen_t , определяющее размер структуры, содержащей клиентский адрес и переданной в accept() . Когда accept() возвращает некоторое значение, socklen_t указывает сколько байт структуры cliaddr использовано в данный момент.

    Функция возвращает дескриптор сокета, связанный с принятым соединением, или −1 в случае возникновения ошибки.

    Прототип [ править | править код ]

    Дополнительные параметры для сокетов [ править | править код ]

    После создания сокета можно задавать для него дополнительные параметры. Вот некоторые из них:

    • TCP_NODELAY отключает алгоритм Нейгла;
    • SO_KEEPALIVE включает периодические проверки на наличие ‘признаков жизни’, если это поддерживается ОС.

    Блокирующие и неблокирующие сокеты [ править | править код ]

    Сокеты Беркли могут работать в одном из двух режимов: блокирующем или неблокирующем. Блокирующий сокет не возвращает контроль, пока не отошлёт (или пока не получит) все данные, указанные для операции. Это верно лишь для Linux-систем. В других системах, например во FreeBSD, вполне естественно для блокирующего сокета посылать не все данные (но можно поставить в send() или recv() флаг MSG_WAITALL). Приложение должно проверять возвращаемое значение для отслеживания того, сколько байт было послано/получено и, соответственно, перепосылать необработанную на данный момент информацию [2] . Это может привести к проблемам, если сокет продолжает «слушать»: программа может повиснуть из-за того, что сокет ждет данных, которые могут никогда не прибыть.

    Сокет обычно указывается блокирующим или неблокирующим при помощи функций fcntl() или ioctl() .

    Передача данных [ править | править код ]

    Для передачи данных можно пользоваться стандартными функциями чтения/записи файлов read и write , но есть специальные функции для передачи данных через сокеты:

    Нужно обратить внимание, что при использовании протокола TCP (сокеты типа SOCK_STREAM ) есть вероятность получить меньше данных, чем было передано, так как ещё не все данные были приняты, поэтому нужно либо дождаться, когда функция recv возвратит 0 байт, либо выставить флаг MSG_WAITALL для функции recv , что заставит её дождаться окончания передачи. Для остальных типов сокетов флаг MSG_WAITALL ничего не меняет (например, в UDP весь пакет = целое сообщение). См. также главу «Блокирующие и неблокирующие сокеты».

    Высвобождение ресурсов [ править | править код ]

    Система не освобождает ресурсы, выделенные при вызове socket() , пока не произойдет вызова close() . Это особенно важно в случае, если вызов connect() прошёл неудачно и может быть повторен. Каждый вызов socket() должен иметь соответствующий вызов close() во всех возможных путях исполнения. Необходимо добавлять заголовочный файл для поддержки функции закрытия.

    Результатом выполнения системного вызова close() является только обращение к интерфейсу для закрытия сокета, а не закрытие самого сокета. Это является командой для ядра закрыть сокет. Иногда на серверной стороне сокет может перейти в режим ожидания TIME_WAIT длительностью до 4 минут.[1]

    Пример клиента и сервера, использующих TCP [ править | править код ]

    TCP реализует концепцию соединения. Процесс создаёт TCP-сокет вызовом функции socket() с параметрами PF_INET или PF_INET6 , а также SOCK_STREAM (Потоковый сокет) и IPPROTO_TCP .

    Сервер [ править | править код ]

    Создание простейшего TCP-сервера состоит из следующих шагов:

    • Создание TCP-сокетов вызовом функции socket() .
    • Привязывание сокета к прослушиваемому порту вызовом функции bind() . Перед вызовом bind() программист должен объявить структуру sockaddr_in , очистить её (при помощи memset() ), затем sin_family ( PF_INET или PF_INET6 ) и заполнить поля sin_port (прослушиваемый порт, указать в виде последовательности байтов). Преобразование short int в порядок байтов может быть выполнено при помощи вызова функции htons() (сокращение от «от хоста в сеть»).
    • Подготовка сокета к прослушиванию на предмет соединений (создание прослушиваемого сокета) при помощи вызова listen() .
    • Принятие входящих соединений через вызов accept() . Это блокирует сокет до получения входящего соединения, после чего возвращает дескриптор сокета для принятого соединения. Первоначальный дескриптор остаётся прослушиваемым дескриптором, а accept() может быть вызван вновь для этого сокета в любое время (пока он открыт).
    • Соединение с удаленным хостом, которое может быть создано при помощи send() и recv() или write() и read() .
    • Итоговое закрытие каждого открытого сокета, который больше не нужен, происходит при помощи close() . Необходимо отметить, что если были любые вызовы fork() , то каждый процесс должен закрыть известные ему сокеты (ядро отслеживает количество процессов, имеющих открытый дескриптор), а кроме того, два процесса не должны использовать один и тот же сокет в одно время.
    Читайте также:  Как сделать свою иконку для ярлыка windows 10

    Клиент [ править | править код ]

    Создание TCP-клиента происходит следующим образом:

    • Создание TCP-сокета вызовом socket() .
    • Соединение с сервером при помощи connect() , передача структуры sockaddr_in с sin_family с указанными PF_INET или PF_INET6 , sin_port для указания порта прослушивания (в байтовом порядке), и sin_addr для указания IPv4 или IPv6 адреса прослушиваемого сервера (также в байтовом порядке).
    • Взаимодействие с сервером при помощи send() и recv() или write() и read() .
    • Завершение соединения и сброс информации при вызове close() . Аналогично, если были какие-либо вызовы fork() , каждый процесс должен закрыть ( close() ) сокет.

    Пример клиента и сервера, использующих UDP [ править | править код ]

    UDP основывается на протоколе без установления соединений, то есть протокол, не гарантирующий доставку информации. UDP-пакеты могут приходить не в указанном порядке, дублироваться и приходить более одного раза, или даже не доходить до адресата вовсе. Из-за этих минимальных гарантий UDP значительно уступает протоколу TCP. Отсутствие установки соединений означает отсутствие потоков или соединений между двумя хостами, так как вместо этого данные прибывают в датаграммах (Датаграммный сокет).

    Адресное пространство UDP, область номеров UDP-портов (в терминологии ISO — TSAP) полностью отделены от TCP-портов.

    Сервер [ править | править код ]

    Код может создавать UDP-сервер на порту 7654 следующим образом:

    bind() связывает сокет с парой адрес/порт.

    Такой бесконечный цикл получает все UDP-датаграммы, приходящие на порт 7654, при помощи recvfrom(). Функция использует параметры:

    • сокет,
    • указатель на буфер данных,
    • размер буфера,
    • флаги (аналогично при чтении или других сокетных функциях получения),
    • адресная структура отправителя,
    • длина адресной структуры отправителя.

    Клиент [ править | править код ]

    Простейшая демонстрация отправки UDP-пакета, содержащего «Привет!» на адрес 127.0.0.1, порт 7654, выглядит примерно так:

    См. также [ править | править код ]

    • Компьютерная сеть
    • Интернет-сокет
    • Сокет домена UNIX
    • Winsock — API, основанный на сокетах Беркли, но предназначенный для создания распределённых приложений на платформе Microsoft Windows

    Примечания [ править | править код ]

    1. Uresh Vahalia. UNIX internals: the new frontiers. — Upper Saddle River, New Jersey 07458: Prentice Hall PTR, 2003. — 844 с. — ISBN 0-13-101908-2.
    2. ↑Beej’s Guide to Network Programming

    Ссылки [ править | править код ]

    Определение стандарта «де юре» интерфейса сокетов, содержащееся в стандарте POSIX, более известное как:

    I’ve been trying to write a server in C++ Unix style, but I’m stuck on a Windows machine. I started with MinGW, but it didn’t compile right and told me that it couldn’t find the «sys/socket.h» file. Which, of course, is necessary for the server to even work. I went searching for it, and I think somewhere said to install Cygwin instead, as it comes with lots of libraries. Okay, so I installed it. Every single library it could possibly offer me. Then I went to compile again, and it STILL can’t find it. I went searching through the ENTIRE includes folder, and couldn’t find the file. So I was a little miffed (3 hours down the drain for extra functionality I don’t need), but I continued to search. I can’t find it ANYWHERE. I find multiple references to using it, but I can’t find ANYWHERE to download it. I’ve been searching for the past few hours now, and I’ve become very frustrated with everything because there are NO references to where I can get it (and I will NOT use winsock. That breaks compatibility if I remember right).

    So, long story short, where can I download the ‘socket.h’/’socket.c’/’socket.cpp’ files? It would make my life (and I’m sure many others’ lives) SO much easier, and I would really appreciate it!

    4 Answers 4

    Given that Windows has no sys/socket.h, you might consider just doing something like this:

    I know you indicated that you won’t use WinSock, but since WinSock is how TCP networking is done under Windows, I don’t see that you have any alternative. Even if you use a cross-platform networking library, that library will be calling WinSock internally. Most of the standard BSD sockets API calls are implemented in WinSock, so with a bit of futzing around, you can make the same sockets-based program compile under both Windows and other OS’s. Just don’t forget to do a

    at the top of main(). otherwise all of your socket calls will fail under Windows, because the WSA subsystem wasn’t initialized for your process.

    Since you’ve labeled the question C++, you might be interested in using boost::asio, ACE, or some other cross-platform socket library for C++ or for C. Some other cross-platform libraries may be found in the answers to C++ sockets library for cross-platform and Cross platform Networking API.

    Assuming that using a third party cross-platform sockets library is not an option for you.

    The header is defined in IEEE Std. 1003.1 (POSIX), but sadly Windows is non-compliant with the POSIX standard. The MinGW compiler is a port of GCC for compiling Windows applications, and therefore does not include these POSIX system headers. If you install GCC using Cygwin, then it will include these system headers to emulate a POSIX environment on Windows. Be aware, however, that if you use Cygwin for sockets that a.) you will need to put the cygwin DLL in a place where your application can read it and b.) Cygwin headers and Windows headers don’t interact very well (so if you plan on including windows.h , then you probably don’t want to be including sys/socket.h ).

    Читайте также:  Linux which process is writing to file

    My personal recommendation would be to download a copy of VirtualBox, download a copy of Ubuntu, install Ubuntu into VirtualBox, and then do your coding and testing on Ubuntu. Alternatively, I am told that Microsoft sells a «UNIX subsystem» and that it is pre-installed on certain higher-end editions of Windows, although I have no idea how compliant this system is (and, if it is compliant, with which edition of the UNIX standard it is compliant). Winsockets are also an option, although they can behave in subtly different ways than their POSIX counterparts, even though the signatures may be similar.

    Сокеты (англ. socket — разъём) — название программного интерфейса для обеспечения обмена данными между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения.

    Принципы сокетов¶

    Каждый процесс может создать слушающий сокет (серверный сокет) и привязать его к какому-нибудь порту операционной системы (в UNIX непривилегированные процессы не могут использовать порты меньше 1024). Слушающий процесс обычно находится в цикле ожидания, то есть просыпается при появлении нового соединения. При этом сохраняется возможность проверить наличие соединений на данный момент, установить тайм-аут для операции и т.д.

    Каждый сокет имеет свой адрес. ОС семейства UNIX могут поддерживать много типов адресов, но обязательными являются INET-адрес и UNIX-адрес. Если привязать сокет к UNIX-адресу, то будет создан специальный файл (файл сокета) по заданному пути, через который смогут сообщаться любые локальные процессы путём чтения/записи из него (см. Доменный сокет Unix). Сокеты типа INET доступны из сети и требуют выделения номера порта.

    Обычно клиент явно подсоединяется к слушателю, после чего любое чтение или запись через его файловый дескриптор будут передавать данные между ним и сервером.

    Основные функции¶

    Общие
    Socket Создать новый сокет и вернуть файловый дескриптор
    Send Отправить данные по сети
    Receive Получить данные из сети
    Close Закрыть соединение
    Серверные
    Bind Связать сокет с IP-адресом и портом
    Listen Объявить о желании принимать соединения. Слушает порт и ждет когда будет установлено соединение
    Accept Принять запрос на установку соединения
    Клиентские
    Connect Установить соединение

    socket()¶

    Создаёт конечную точку соединения и возвращает файловый дескриптор. Принимает три аргумента:

    domain указывающий семейство протоколов создаваемого сокета

    • AF_INET для сетевого протокола IPv4
    • AF_INET6 для IPv6
    • AF_UNIX для локальных сокетов (используя файл)

    type

    • SOCK_STREAM (надёжная потокоориентированная служба (сервис) или потоковый сокет)
    • SOCK_DGRAM (служба датаграмм или датаграммный сокет)
    • SOCK_RAW (Сырой сокет — сырой протокол поверх сетевого уровня).

    protocol

    Протоколы обозначаются символьными константами с префиксом IPPROTO_* (например, IPPROTO_TCP или IPPROTO_UDP). Допускается значение protocol=0 (протокол не указан), в этом случае используется значение по умолчанию для данного вида соединений.

    Функция возвращает −1 в случае ошибки. Иначе, она возвращает целое число, представляющее присвоенный дескриптор.

    Пример на Python

    Связывает сокет с конкретным адресом. Когда сокет создается при помощи socket(), он ассоциируется с некоторым семейством адресов, но не с конкретным адресом. До того как сокет сможет принять входящие соединения, он должен быть связан с адресом. bind() принимает три аргумента:

    1. sockfd — дескриптор, представляющий сокет при привязке
    2. serv_addr — указатель на структуру sockaddr, представляющую адрес, к которому привязываем.
    3. addrlen — поле socklen_t, представляющее длину структуры sockaddr.

    Возвращает 0 при успехе и −1 при возникновении ошибки.

    Пример на Python

    Автоматическое получение имени хоста.

    listen()¶

    Подготавливает привязываемый сокет к принятию входящих соединений. Данная функция применима только к типам сокетов SOCK_STREAM и SOCK_SEQPACKET. Принимает два аргумента:

    1. sockfd — корректный дескриптор сокета.
    2. backlog — целое число, означающее число установленных соединений, которые могут быть обработаны в любой момент времени. Операционная система обычно ставит его равным максимальному значению.

    После принятия соединения оно выводится из очереди. В случае успеха возвращается 0, в случае возникновения ошибки возвращается −1.

    Пример на Python

    accept()¶

    Используется для принятия запроса на установление соединения от удаленного хоста. Принимает следующие аргументы:

    1. sockfd — дескриптор слушающего сокета на принятие соединения.
    2. cliaddr — указатель на структуру sockaddr, для принятия информации об адресе клиента.
    3. addrlen — указатель на socklen_t, определяющее размер структуры, содержащей клиентский адрес и переданной в accept(). Когда accept() возвращает некоторое значение, socklen_t указывает сколько байт структуры cliaddr использовано в данный момент.

    Функция возвращает дескриптор сокета, связанный с принятым соединением, или −1 в случае возникновения ошибки.

    Пример на Python

    connect()¶

    Устанавливает соединение с сервером.

    Некоторые типы сокетов работают без установления соединения, это в основном касается UDP-сокетов. Для них соединение приобретает особое значение: цель по умолчанию для посылки и получения данных присваивается переданному адресу, позволяя использовать такие функции как send() и recv() на сокетах без установления соединения.

    Загруженный сервер может отвергнуть попытку соединения, поэтому в некоторых видах программ необходимо предусмотреть повторные попытки соединения.

    Возвращает целое число, представляющее код ошибки: 0 означает успешное выполнение, а −1 свидетельствует об ошибке.

    Пример на Python

    Передача данных¶

    Для передачи данных можно пользоваться стандартными функциями чтения/записи файлов read и write, но есть специальные функции для передачи данных через сокеты:

    Нужно обратить внимание, что при использовании протокола TCP (сокеты типа SOCK_STREAM) есть вероятность получить меньше данных, чем было передано, так как ещё не все данные были переданы, поэтому нужно либо дождаться, когда функция recv возвратит 0 байт, либо выставить флаг MSG_WAITALL для функции recv, что заставит её дождаться окончания передачи. Для остальных типов сокетов флаг MSG_WAITALL ничего не меняет (например, в UDP весь пакет = целое сообщение).

    send, sendto — отправка данных.

  • Оцените статью