Опять создаем тот же проект, что и в предыдущих шагах.
Я снова вынес пройденный код в процедуры. Только переменную SOCKET я сделал глобальной, так как она в последствии будет использоваться во многих командах. То что должно находиться в этих процедурах понятно из прошлых шагов.
...... void CreateSocket(); void CloseScoket(); SOCKET servsocket; ......
После создания сокета его нужно связать с портом. Для этого существует функция bind. Но нам нужен номер порта для связи, я его объявил так:
#define PORT_ADDR 80
Мы пытаемся реализовать сервер работающий по протоколу HTTP, а для этого протокола используется порт 80. Вы можете, если конечно знаете, использовать другие порты.
Для организации связи нам необходимо создать структуру SOCKADDR_IN она необходима для выполнения команды bind и в ней содержатся параметры связи, такие как порт и атрибуты. Вот её описание.
struct sockaddr_in{ short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8];};
В данной структуре есть вложенная структура sin_addr она описана вот так:
struct in_addr { union { struct{ unsigned char s_b1, s_b2, s_b3, s_b4; } S_un_b; struct{ unsigned short s_w1, s_w2; } S_un_w; unsigned long S_addr; } S_un; };
После описания структур и заполения данными можно вызывать bind:
SOCKADDR_IN socketaddr; socketaddr.sin_family = AF_INET; socketaddr.sin_addr.s_addr = INADDR_ANY; socketaddr.sin_port = PORT_ADDR; if (bind(servsocket,(LPSOCKADDR)&socketaddr,sizeof(socketaddr)) == SOCKET_ERROR) { printf("Error bind socket"); exit(1); } else printf("God bind socket !!!!!!\n");
Вот её описание:
int bind ( SOCKET s, const struct sockaddr FAR* name, int namelen );
Если всё нормально, то данная функция вернет 0 в противном случае SOCKET_ERROR.