До сих пор мы обсуждали только теоретические аспекты работы с сокетами. Далее будут рассматриваться конкретные функции, позволяющие осуществлять те или иные операции с сокетами. Эти функции экспортируются системной библиотекой wsock32.dll (а также библиотекой ws2_32.dll; взаимоотношение этих библиотек будет обсуждаться во втором разделе данной главы), для их использования в Delphi в раздел uses нужно добавить стандартный модуль WinSock
Хотя ранее мы договорились, что будем обсуждать только стандартные сокеты, тем не менее, есть три функции, относящиеся к сокетам Windows, не познакомившись с которыми мы не сможем двигаться дальше. Это функции WSAStartup
WSACleanup
и WSAGetLastError
(префикс WSA означает Windows Sockets API и служит для именования большинства функций, относящихся к Windows-расширению библиотеки сокетов).Функция WSAStartup
function WSAStartup(wVersionRequired: Word; var WSData: TWSAData): Integer;
Параметр wVersionRequired
WinSock
не рассчитан на их поддержку. Вопросы взаимоотношения библиотек и версий будут рассматриваться во втором разделе этой главы, а пока ограничимся версией 1.1.Параметр WSData
Нулевое значение, возвращаемое функцией, говорит об успешном завершении, в противном случае возвращается код ошибки. Обычно функция, завершившаяся с ошибкой, возвращает значение SOCKET_ERROR
Функция WSACleanup
WSAStartup
достаточно вызвать один раз, даже в многонитевом приложении, в этом ее отличие от таких функций, как, например, CoInitialize
, которая должна быть вызвана в каждой нити, использующей COM. Функцию можно вызывать повторно — в этом случае ее вызов не дает никакого эффекта, но для завершения работы с библиотекой сокетов функция WSACleanup
должна быть вызвана столько же раз, сколько была вызвана WSAStartup
.Большинство функций библиотеки сокетов возвращают значение, позволяющее судить только об успешном или неуспешном завершении операции, но не дающее информации о том, какая именно ошибка произошла (если она произошла). Для получения сведений об ошибке служит функция WSAGetLastError
WSAGetLastError
, чтобы выяснить причину неудачи.Забегая чуть вперед, отметим, что библиотека сокетов содержит стандартную функцию getsockopt
WSAGetLastError
. К тому же, getsockopt
возвращает ошибку, связанную с указанным сокетом, поэтому с её помощью нельзя получить код ошибки, не связанной с конкретным сокетом.Для создания сокета предусмотрена стандартная функция socket
function socket(af, struct, protocol: Integer): TSocket;
Параметр аf
AF_INET
, для других стеков также есть соответствующие константы, которые можно посмотреть в файле WinSock.pas.