После инициализации интерфейса Windows Sockets ваше приложение должно создать один или несколько сокетов, которые будут использованы для передачи данных.
Создание сокета
Сокет создается с помощью функции socket, имеющей следующий прототип:
SOCKET socket (int af, int type, int protocol);
Параметр af определяет формат адреса. Для этого параметра вы должны указывать значение AF_INET, что соответствует формату адреса, принятому в Internet.
Параметры type и protocol определяют, сооветственно, тип сокета и протокол, который будет использован для данного сокета.
Можно указывать сокеты следующих двух типов:
Тип сокета | Описание |
SOCK_STREAM | Сокет будет использован для передачи данных через канал связи с использованием протокола TCP |
SOCK_DGRAM | Передача данных будет выполняться без создания каналов связи через датаграммный протокол UDP |
Что же касается параметра protocol, то вы можете указать для него нулевое значение.
В случае успеха функция socket возвращает дескриптор, который нужно использовать для выполнения всех операций над данным сокетом. Если же произошла ошибка, эта функция возвращает значение INVALID_SOCKET. Для анализа причины ошибки вы должны вызвать функцию WSAGetLastError, которая в данном случае может вернуть один из следующих кодов ошибки:
Код ошибки | Описание |
WSANOTINITIALISED | Интерфейс Windows Sockets не был проинициализирован функцией WSAStartup |
WSAENETDOWN | Сбой сетевого программного обеспечения |
WSAEAFNOSUPPORT | Указан неправильный тип адреса |
WSAEINPROGRESS | Выполняется блокирующая функция интерфейса Windows Sockets |
WSAEMFILE | Израсходован весь запас свободных дескрипторов |
WSAENOBUFS | Нет памяти для создания буфера |
WSAEPROTONOSUPPORT | Указан неправильный протокол |
WSAEPROTOTYPE | Указанный протокол несовместим с данным типом сокета |
WSAESOCKTNOSUPPORT | Указанный тип сокета несовместим с данным типом адреса |
Ниже мы привели фрагмент кода, в котором создается сокет для передачи данных с использованием протокола TCP:
srv_socket = socket(AF_INET, SOCK_STREAM, 0);
if(srv_socket == INVALID_SOCKET)
{
MessageBox(NULL, "socket Error", "Error", MB_OK);
return;
}