Параметр struct
SOCK_STREAM
(для потоковых протоколов) и SOCK_DGRAM
(для дейтаграммных протоколов).Параметр protocol
IPPROTO_IP
. Значение этой константы равно 0, и ее использование только повышает читабельность кода, но приводит к тому же результату: будет выбран протокол по умолчанию. Если требуется протокол, отличный от протокола по умолчанию (например, в некоторых реализациях стека TCP/IP существует протоколIPPROTO_RDP
). Можно также явно задать TCP или UDP с помощью констант IPPROTO_TCP
и IPPROTO_UDP
соответственно.Тип TSocket
TSocket
бессмысленны. Значение, возвращаемое функцией socket
, следует сохранить в переменной соответствующего типа и затем использовать для идентификации сокета при вызове других функций. Если по каким-то причинам создание сокета невозможно, функция вернет значение INVALID_SOCKET
. Причину ошибки можно узнать с помощью функции WSAGetLastError
.Сокет, созданный с помощью функции socket
bind
, имеющей следующий прототип:function bind(s: TSocket; var addr: TSockAddr; namelen: Integer): Integer;
Первый параметр этой функции — дескриптор сокета. который привязывается к адресу. Здесь, как и в остальных подобных случаях, требуется передать значение, которое вернула функция socket
Функция bind
WinSock
для Delphi выбрали не лучший способ перевода прототипа этой функции на Паскаль, поэтому универсальность в значительной мере утрачена. В оригинале прототип функции bind
имеет следующий вид:int bind(SOCKET s, const struct sockaddr FAR* name, int namelen);
Видно, что второй параметр — это указатель на структуру sockaddr
bind
не допустит использования никакой другой структуры, кроме TSockAddr
, а эта структура не универсальна и удобна, по сути дела, только при использовании стека TCP/IP. В других случаях наилучшим решением будет самостоятельно импортировать функцию bind
из wsock32.dll с нужным прототипом. При этом придется импортировать и некоторые другие функции, работающие с адресами. Впрочем мы здесь ограничиваемся только протоколами TCP и UDP, поэтому больше останавливаться на этом вопросе не будем.На самом деле существует способ передать в функцию bind
addr
любого типа, совместимого с этой функцией. Если A
— некая переменная типа, отличающегося от TSockAddr
, то передать в качестве параметра-переменной ее можно так: PSockAddr(@А)^
. Однако подобные низкоуровневые операции программу не украшают.