Socket timeout что это
Socket Timeout — An Important and Sometimes Complicated Issue with Python
During my experience working with Python, I’ve had several cases where a network client was left hanging while trying to request a server. After spending some time researching, the root cause was identified and it was found that the server was waiting for a response but there was silence (like being ghosted on a Tinder match).
Of course, an operating system can raise a Connection timed out error, but it doesn’t always seem to happen on hang connections. If it did, probably wouldn’t even run into this issue on the job.
In order to avoid the annoying problem of waiting for an undetermined amount of time, sockets (which are responsible for network communication) support a timeout option which raises an error based on a time limit. Unfortunately, when developers develop their amazing network libraries, they may omit such non-obvious cases and forget to provide socket timeout settings, despite of the docs recommendation:
Let’s look at a simple example of how to simulate hang socket (at a minimum level in Mac OS):
Before I go into showing issue solution, let’s go deep into Python socket implementation in order to understand why it hangs.
Let’s see how the timeout option helps with a hang socket:
As said above, this option can be omitted in libraries which use sockets. Fortunately, Python gives you a chance to set up socket timeout for all new sockets, which will be created during application work:
If this would be enough, the article would finish here. Unfortunately, socket timeout can be reset with a sock.settimeout(None) that some libraries do rather rashly.
A solution for this is monkey-patching of the socket module, like this:
But in the socket there is another way to reset timeout:
Let’s see what happens under the hood of this method:
Here it changes the timeout, without worrying about its default value. Why it works this way you can read more about in the socket docs, but it’s easy to patch:
No more hang sockets any longer.
Keep in mind that these socket monkey-patches may prevent developers from setting a socket blocking mode if the default timeout is set. Unfortunately some libraries do this thing unconsciously and you ultimately have to choose between canonical and working code.
Как настроить таймаут подключения к сокету
Код, который я использую для установки сокет-соединения, следующий:
10 секунд, поэтому функция возвращается не по прошествии заданного промежутка времени, а по прошествии промежутка времени + время
Я не программирую на C #, но на C мы решаем ту же проблему, делая сокет неблокирующим, а затем помещая fd в цикл выбора / опроса со значением тайм-аута, равным времени, в течение которого мы готовы ждать подключения. преуспеть.
Я нашел это для Visual C ++, и объяснение там также склоняется к механизму выбора / опроса, который я объяснял ранее.
По моему опыту, вы не можете изменить значения таймаута подключения для каждого сокета. Вы меняете его для всех (настраивая параметры ОС).
может быть уже слишком поздно, но есть отличное решение на основе Task.WaitAny (c # 5 +):
Я решил проблему, используя метод Socket.ConnectAsync вместо метода Socket.Connect. После вызова Socket.ConnectAsync (SocketAsyncEventArgs) запустите таймер (timer_connection), если время истекло, проверьте, подключено ли соединение с сокетом (если (m_clientSocket.Connected)), если нет, появится ошибка тайм-аута.
Плакат на MSDN фактически решил свою проблему с помощью потоковой передачи. У него был основной поток, который вызывал другие потоки, которые запускали код соединения в течение пары секунд, а затем проверяли свойство Connected сокета:
Что вы пытаетесь сделать, и почему он не может подождать 15-30 секунд до истечения времени ожидания?
У меня была такая же проблема при подключении к сокету, и я придумал следующее решение: оно отлично работает для меня. `
Я работал с Unity, и у меня были проблемы с BeginConnect и другими асинхронными методами из сокета.
Я кое-что не понимаю, но предыдущие примеры кода мне не подходят.
Итак, я написал этот фрагмент кода, чтобы он работал. Я тестирую его в специальной сети с Android и ПК, а также локально на моем компьютере. Надеюсь, это поможет.
и есть очень простой сторожевой таймер на C #, чтобы заставить его работать:
Это похоже на ответ FlappySock, но я добавил к нему обратный вызов, потому что мне не понравился макет и то, как возвращалось логическое значение. В комментариях к этому ответу Ника Миллера:
ConnectionTimeout versus SocketTimeout
I’m having a problem with a library that I am using. It might be the library or it might be me using it wrong!
Basically, when I do this (Timeout in milliseconds)
No timeout exception is generated and it works ok, however, when I do the following,
I get a Socket Exception.
So, my question is why can I not simulate a Connection Exception? Am I misunderstanding the difference between a socket and a connection time-out? The library is here (not officially released yet).
2 Answers 2
A connection timeout occurs only upon starting the TCP connection. This usually happens if the remote machine does not answer. This means that the server has been shut down, you used the wrong IP/DNS name, wrong port or the network connection to the server is down.
A socket timeout is dedicated to monitor the continuous incoming data flow. If the data flow is interrupted for the specified timeout the connection is regarded as stalled/broken. Of course this only works with connections where data is received all the time.
By setting socket timeout to 1 this would require that every millisecond new data is received (assuming that you read the data block wise and the block is large enough)!
If only the incoming stream stalls for more than a millisecond you are running into a timeout.
socket — Низкоуровневый сетевой интерфейс¶
Исходный код: Lib/socket.py
Модуль предоставляет доступ к сокетному BSD интерфейсу. Он доступен во всех современных системах Unix, Windows, MacOS и, возможно, на других платформах.
Незначительное отличие в поведении может зависеть от платформы, поскольку выполняются вызовы API-интерфейсов сокетов ОС.
Интерфейс Python представляет собой прямую транслитерацию системного вызова Unix и интерфейса библиотеки socket в объектно-ориентированный стиль Python: функция socket() возвращает объект сокета, методы которого реализуют различные системные вызовы сокетов. Типы параметров несколько более высокоуровневые, чем в интерфейсе C: как и в случае операций read() и write() с файлами Python, распределение буфера при операциях приёма происходит автоматически, а длина буфера неявна при операциях отправки.
Модуль socketserver Классы, упрощающие запись на сетевые серверы. Модуль ssl Обёртка TLS/SSL для сокетных объектов.
Семейства сокета¶
В зависимости от системы и параметров сборки данный модуль поддерживает различные семейства сокетов.
Формат адреса, требуемый конкретным объектом сокета, выбирается автоматически на основе семейства адресов, указанного при создании объекта сокета. Адреса сокетов представлены следующим образом:
Изменено в версии 3.3: Ранее предполагалось, что пути сокетов AF_UNIX используют кодировку UTF-8.
Изменено в версии 3.7: Для многоадресных адресов (со значимым scopeid) address может не содержать части %scope (или zone id ). Эта информация является излишней и может пропускаться (рекомендуется).
Добавлено в версии 3.3.
AF_BLUETOOTH поддерживает следующие протоколы и форматы адресов:
Изменено в версии 3.2: Добавлена поддержка NetBSD и DragonFlyBSD.
Доступность : В Linux 2.6.38 для некоторых типов алгоритмов требуются более свежие ядра.
Добавлено в версии 3.6.
Доступность : Linux >= 4.8 QEMU >= 2.8 ESX >= 4.0 ESX Workstation >= 6.5.
Добавлено в версии 3.7.
Добавлено в версии 3.8.
Если вы используете имя хоста в части host адреса сокета IPv4/v6, программа может показывать недетерминированное поведение, поскольку Python использует первый адрес, возвращенный из разрешения DNS. Адрес сокета будет по-разному преобразован в фактический адрес IPv4/v6, в зависимости от результатов разрешения DNS и/или конфигурации хоста. Для детерминированного поведения использовать числовой адрес в части host.
Все ошибки вызывают исключения. Могут возникать обычные исключения для недопустимых типов аргументов и состояний нехватки памяти; начиная с Python 3.3, ошибки, связанные с семантикой сокета или адреса, вызывают OSError или один из его подклассов (раньше они вызывали socket.error ).
Содержание модуля¶
Модуль socket экспортирует следующие элементы.
Исключения¶
Константы¶
Добавлено в версии 3.4.
socket. SOCK_STREAM ¶ socket. SOCK_DGRAM ¶ socket. SOCK_RAW ¶ socket. SOCK_RDM ¶ socket. SOCK_SEQPACKET ¶
socket. SOCK_CLOEXEC ¶ socket. SOCK_NONBLOCK ¶
Две константы, если они определены, могут объединяться с типами сокетов и позволяют атомарно устанавливать некоторые флаги (что позволяет избежать возможных состояний гонки и необходимости в отдельных вызовах).
Добавлено в версии 3.2.
Многие константы этих форм, задокументированные в документации Unix по сокетам и/или протоколу IP, также определены в модуле socket. Обычно они используются в аргументах методов setsockopt() и getsockopt() объектов сокета. В большинстве случаев определяются только те символы, которые определены в файлах заголовков Unix; для нескольких символов предусмотрены значения по умолчанию.
Многие константы этих форм, задокументированные в документации Linux, также определены в модуле socket.
Добавлено в версии 3.3.
CAN_BCM, в семействе протоколов CAN, является протоколом менеджера вещания (BCM). Константы менеджера вещания, задокументированные в документации Linux, также определены в модуле socket.
Флаг CAN_BCM_CAN_FD_FRAME доступен только в Linux >= 4.8.
Добавлено в версии 3.4.
Включает поддержку CAN FD в сокете CAN_RAW. По умолчанию отключено. Позволяет вашему приложению отправлять кадры CAN и CAN FD; однако вы должны принимать кадры CAN и CAN FD при чтении из сокета.
Данная константа задокументирована в документации Linux.
Добавлено в версии 3.5.
CAN_ISOTP в семействе протоколов CAN является протоколом ISO-TP (ISO 15765-2). Константы ISO-TP, задокументированные в документации Linux.
Добавлено в версии 3.7.
Многие константы этих форм, задокументированные в документации Linux, также определены в модуле socket.
socket. AF_RDS ¶ socket. PF_RDS ¶ socket. SOL_RDS ¶ RDS_*
Многие константы этих форм, задокументированные в документации Linux, также определены в модуле socket.
Добавлено в версии 3.3.
Константы для Windows WSAIoctl(). Константы используются в качестве аргументов метода ioctl() для объектов сокета.
Константы, связанные с TIPC, совпадающие с константами, экспортируемыми API- интерфейсом C. См. документацию TIPC для получения дополнительной информации.
socket. AF_ALG ¶ socket. SOL_ALG ¶ ALG_*
Константы для криптографии ядра Linux.
Добавлено в версии 3.6.
Константы для связи хоста/гостя Linux.
Добавлено в версии 3.7.
Добавлено в версии 3.4.
Константа содержит логическое значение, которое указывает, поддерживается ли IPv6 на этой платформе.
socket. BDADDR_ANY ¶ socket. BDADDR_LOCAL ¶
socket. HCI_FILTER ¶ socket. HCI_TIME_STAMP ¶ socket. HCI_DATA_DIR ¶
Константа для протокола маршрутизатора IPC Qualcomm, используемая для связи с удаленными процессорами, предоставляющими услуги.
Функции¶
Создание сокета¶
socket. socket ( family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None ) ¶
Изменено в версии 3.3: Было добавлено семейство AF_CAN. Добавлено семейство AF_RDS.
Изменено в версии 3.4: Добавлен протокол CAN_BCM.
Изменено в версии 3.4: Возвращенный сокет теперь не наследуется.
Изменено в версии 3.7: Добавлен протокол CAN_ISOTP.
Изменено в версии 3.2: Возвращенные объекты сокета теперь поддерживают весь API сокета, а не его подмножество.
Изменено в версии 3.4: Возвращенные сокеты теперь не наследуются.
Изменено в версии 3.5: Добавлена поддержка Windows.
Изменено в версии 3.2: Был добавлен source_address.
Удобная функция, которая создаёт TCP сокет, привязанный к address (2-кортеж (host, port) ), и возвращает объект сокета.
На платформах POSIX параметр сокета SO_REUSEADDR устанавливается для немедленного повторного использования предыдущих сокетов, которые были привязаны к тому же address и оставались в состоянии TIME_WAIT.
Добавлено в версии 3.8.
Добавлено в версии 3.8.
Дубликат файлового дескриптора fd (целое число, возвращаемое методом fileno() файлового объекта) и создать объект сокета из результата. Семейство адресов, тип сокета и номер протокола такие же, как для функции socket() выше. Дескриптор файла должен ссылаться на сокет, но это не проверяется — последующие операции над объектом могут завершиться неудачно, если дескриптор файла недействителен. Данная функция редко требуется, но может использоваться для получения или установки параметров сокета для сокета, передаваемого программе в качестве стандартного ввода или вывода (например, сервера, запущенного демоном inet Unix). Предполагается, что сокет находится в режиме блокировки.
Изменено в версии 3.4: Возвращенный сокет теперь не наследуется.
Добавлено в версии 3.3.
Прочие функции¶
Модуль socket также предлагает различные сетевые сервисы:
Добавлено в версии 3.7.
Аргументы family, type и proto могут дополнительно указываться, чтобы сузить список возвращаемых адресов. Передача нуля в качестве значения для каждого из этих аргументов выбирает полный диапазон результатов. Аргумент flags может быть одной или несколькими константами AI_* и будет влиять на то, как вычисляются и возвращаются результаты. Например, AI_NUMERICHOST отключит разрешение доменного имени и вызовет ошибку, если host — доменное имя.
Функция возвращает список из 5 кортежей со следующей структурой:
(family, type, proto, canonname, sockaddr)
В следующем примере выполняется выборка адресной информации для гипотетического TCP-соединения с example.org через порт 80 (результаты могут отличаться в вашей системе, если IPv6 не включён):
Изменено в версии 3.2: параметры теперь можно передавать с помощью ключевых аргументов.
socket. gethostbyname ( hostname ) ¶
socket. gethostbyname_ex ( hostname ) ¶
Вернуть строку, содержащую имя хоста компьютера, на котором в настоящее время выполняется интерпретатор Python.
Поднимает событие аудита socket.gethostname без аргументов.
socket. gethostbyaddr ( ip_address ) ¶
socket. getnameinfo ( sockaddr, flags ) ¶
Для адресов IPv6 %scope добавляется к части хоста, если sockaddr содержит значимый scopeid. Обычно это происходит с многоадресными адресами.
Для получения дополнительной информации о flags вы можете обратиться к getnameinfo(3).
socket. getprotobyname ( protocolname ) ¶
Преобразовать 32-битные положительные целые числа из сети в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с порядком байтов в сети, это не работает; в противном случае выполняется операция перестановки 4 байтов.
Преобразовать 16-битные положительные целые числа из сети в порядок байтов хоста. На машинах, где порядок байтов хоста совпадает с порядком байтов в сети, это не работает; в противном случае он выполняет 2-байтовую операцию обмена.
Не рекомендуется, начиная с версии 3.7: В случае, если x не помещается в 16-битное целое число без знака, но подходит к положительному C int, оно автоматически усекается до 16-битного целого числа без знака. Эта функция тихого усечения устарела и вызовет исключение в будущих версиях Python.
Преобразовать 32-битные положительные целые числа из хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с порядком байтов в сети, это не работает; в противном случае выполняется операция перестановки 4 байтов.
Преобразовать 16-битные положительные целые числа из хоста в сетевой порядок байтов. На машинах, где порядок байтов хоста совпадает с порядком байтов в сети, это не работает; в противном случае он выполняет 2-байтовую операцию обмена.
Не рекомендуется, начиная с версии 3.7: В случае, если x не помещается в 16-битное целое число без знака, но подходит к положительному C int, оно автоматически усекается до 16-битного целого числа без знака. Эта функция тихого усечения устарела и вызовет исключение в будущих версиях Python.
inet_aton() также принимает строки с менее чем тремя точками; подробности см. на странице руководства Unix inet(3).
inet_aton() не поддерживает IPv6, и вместо него следует использовать inet_pton() для поддержки двойного стека IPv4/v6.
socket. inet_ntoa ( packed_ip ) ¶
Доступность : Unix (возможно, не все платформы), Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
Доступность : Unix (возможно, не все платформы), Windows.
Изменено в версии 3.4: Добавлена поддержка Windows
Доступность : большинство платформ Unix, возможно, другие.
Добавлено в версии 3.3.
Обратите внимание, что некоторые системы могут поддерживать вспомогательные данные без предоставления этой функции. Также обратите внимание, что установка размера буфера с использованием результатов этой функции может не точно ограничивать объем вспомогательных данных, которые могут быть получены, поскольку дополнительные данные могут уместиться в области заполнения.
Доступность : большинство платформ Unix, возможно, другие.
Добавлено в версии 3.3.
socket. setdefaulttimeout ( timeout ) ¶
socket. sethostname ( name ) ¶
Добавлено в версии 3.3.
Возвращает список кортежей с информацией о сетевом интерфейсе (индекс int, строка имени). OSError в случае сбоя системного вызова.
Добавлено в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
В Windows у сетевых интерфейсов разные имена в разных контекстах (все имена являются примерами):
Добавлено в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
Добавлено в версии 3.3.
Изменено в версии 3.8: Добавлена поддержка Windows.
Объекты сокета¶
Изменено в версии 3.4: Сокет теперь не наследуется.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).
Привязать сокет к address. Сокет ещё не должен быть привязан. (Формат address зависит от семейства адресов, см. выше.)
Подключиться к удаленному сокету по address. (Формат address зависит от семейства адресов, см. выше.)
Перевести объект сокета в закрытое состояние, не закрывая дескриптор файла. Возвращается файловый дескриптор, который может повторно использоваться для других целей.
Добавлено в версии 3.2.
Изменено в версии 3.4: Сокет теперь не наследуется.
В Windows малое целое число, возвращаемое этим методом, нельзя использовать там, где можно использовать дескриптор файла (например, os.fdopen() ). Unix не содержит этого ограничения.
Добавлено в версии 3.4.
Вернуть удаленный адрес, к которому подключён сокет. Полезно, например, для определения номера порта удаленного сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов, см. выше.) В некоторых системах функция не поддерживается.
Вернуть собственный адрес сокета. Полезно, например, для определения номера порта сокета IPv4/v6. (Формат возвращаемого адреса зависит от семейства адресов, см. выше.)
Добавлено в версии 3.7.
socket. ioctl ( control, option ) ¶
Platform: | Windows |
---|
Метод ioctl() — ограниченный интерфейс для системного интерфейса WSAIoctl. Пожалуйста, обратитесь к документации по Win32 для получения дополнительной информации.
На других платформах могут использоваться общие функции fcntl.fcntl() и fcntl.ioctl() ; они принимают объект сокета в качестве своего первого аргумента.
Разрешить серверу принимать соединения. Если указано backlog, оно должно быть не менее 0 (если меньше, устанавливается на 0); он определяет количество неприемлемых подключений, которое система разрешит до отказа от новых подключений. Если не указано, выбирается разумное значение по умолчанию.
Изменено в версии 3.5: Параметр backlog теперь необязателен.
Сокет должен находиться в режиме блокировки; у него может быть тайм-аут, но внутренний буфер файлового объекта может оказаться в несогласованном состоянии, если произойдёт тайм-аут.
Получать данные из сокета. Возвращаемое значение — байтовый объект, представляющий полученные данные. Максимальный объем данных, который должен быть получен за один раз, определяется параметром bufsize. См. страницу руководства Unix recv(2) для получения информации о значениях необязательных аргументов flags; по умолчанию он равен нулю.
Для наилучшего соответствия с аппаратными и сетевыми реалиями значение bufsize должно быть относительно небольшим, равным 2, например 4096.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).
Некоторые системы не указывают усеченную длину элементов вспомогательных данных, которые были получены только частично. Если кажется, что элемент выходит за пределы буфера, recvmsg() поднимет RuntimeWarning и вернёт его часть, которая находится внутри буфера, при условии, что она не была усечена до начала связанных с ним данных.
Доступность : большинство платформ Unix, возможно, другие.
Добавлено в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).
Доступность : большинство платформ Unix, возможно, другие.
Добавлено в версии 3.3.
Получать до nbytes байт из сокета, сохраняя данные в буфере, а не создавая новую строку байтов. Если nbytes не указан (или 0), получить до размера, доступного в данном буфере. Возвращает количество полученных байтов. См. страницу руководства Unix recv(2), чтобы узнать о значениях необязательных аргументов flags; по умолчанию он равен нулю.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).
Изменено в версии 3.5: Тайм-аут сокета больше не сбрасывается каждый раз, когда данные отправляются успешно. Тайм-аут сокета теперь является максимальной общей продолжительностью отправки всех данных.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).
Отправить данные в сокет. Сокет не должен подключаться к удаленному сокету, т. к. сокет назначения указан по address. У необязательного аргумента flags то же значение, что и для recv() выше. Возвращает количество отправленных байтов. (Формат address зависит от семейства адресов, см. выше.)
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (обоснование см. в PEP 475).
Доступность : большинство платформ Unix, возможно, другие.
Добавлено в версии 3.3.
Изменено в версии 3.5: Если системный вызов прерывается и обработчик сигнала не вызывает исключения, метод теперь повторяет системный вызов вместо того, чтобы вызывать исключение InterruptedError (объяснение см. в PEP 475).
Добавлено в версии 3.6.
Добавлено в версии 3.5.
Установить наследуемый флаг дескриптора файла сокета или дескриптора сокета.
Добавлено в версии 3.4.
Установить блокирующий или неблокирующий режим сокета: если flag ложен, сокет установлен в неблокирующий режим, в противном случае — в режим блокировки.
Метод является сокращением для некоторых вызовов settimeout() :
Изменено в версии 3.6: Добавлена форма setsockopt(level, optname, None, optlen: int).
socket. share ( process_id ) ¶
Добавлено в версии 3.3.
Обратите внимание, что нет методов read() или write() ; вместо этого использовать recv() и send() без аргумента flags.
Примечания относительно тайм-аутов сокетов¶
Таймауты и метод connect ¶
Таймауты и метод accept ¶
Пример¶
Первые два примера поддерживают только IPv4.
Следующие два примера идентичны двум предыдущим, но поддерживают как IPv4, так и IPv6. Сторона сервера будет прослушивать первое доступное семейство адресов (вместо этого она должна прослушивать оба). В большинстве систем с поддержкой IPv6 IPv6 будет приоритетнее, и сервер может не принимать трафик IPv4. Клиентская сторона попытается подключиться ко всем адресам, полученным в результате разрешения имён, и отправит трафик на первый успешно подключенный.
В следующем примере показано, как написать очень простой сетевой сниффер с необработанными (сырыми) сокетами в Windows. В примере требуются права администратора для изменения интерфейса:
В следующем примере показано, как использовать интерфейс сокета для связи с сетью CAN с использованием протокола сырых сокетов. Чтобы вместо этого использовать CAN с протоколом менеджера вещания, открыть сокет с помощью:
После привязки ( CAN_RAW ) или подключения ( CAN_BCM ) сокета вы можете использовать операции socket.send() и socket.recv() (и их аналоги) для объекта сокета как обычно.
В этом последнем примере могут потребоваться особые привилегии:
Выполнение примера несколько раз со слишком малой задержкой между выполнениями может привести к этой ошибке:
Это связано с тем, что предыдущее выполнение оставило сокет в состоянии TIME_WAIT и не может немедленно повторно использовано.
Введение в программирование сокетов (на C) см. в следующих статьях:
оба в руководстве программиста UNIX, дополнительные документы 1 (разделы PS1: 7 и PS1: 8). Справочные материалы для различных платформ, относящиеся к системным вызовам, связанным с сокетами, также являются ценным источником информации о деталях семантики сокетов. Для Unix см. справочные страницы; для Windows см. спецификацию WinSock (или Winsock 2). Для интерфейсов API с поддержкой IPv6 читатели могут захотеть обратиться к RFC 3493, озаглавленному «Расширения базового интерфейса сокетов для IPv6».