ачі даних по мережі. Нарешті, останній атрибут визначає протокол, використовуваний для передачі даних. Часто протокол однозначно визначається по домену і типу сокета. У цьому випадку в якості третього параметра функції socket можна передати 0, що відповідає протоколу за замовчуванням. Тим не менш, іноді (наприклад, при роботі з низькорівневими сокетами) потрібно задати протокол явно. Числові ідентифікатори протоколів залежать від обраного домену; їх можна знайти в документації. p align="justify"> Перш ніж передавати дані через сокет, його необхідно пов'язати з адресою у вибраному домені (цю процедуру називають ім'ям сокета). Іноді зв'язування здійснюється неявно (всередині функцій connect і accept), але виконувати його необхідно у всіх випадках. Вид адреси залежить від обраного вами домену. У Unix-домені це текстова рядок - ім'я файлу, через який відбувається обмін даними. В Internet-домені адресу задається комбінацією IP-адреси і 16-бітного номера порту. IP-адреса визначає хост в мережі, а порт - конкретний сокет на цьому хості. Протоколи TCP і UDP використовують різні простору портів. p align="justify"> Для явного зв'язування сокета з деякою адресою використовується функція bind. Її прототип має вигляд:
bind (int sockfd, struct sockaddr * addr, int addrlen);
В якості першого параметра передається дескриптор сокета, який ми хочемо прив'язати до заданого адресою. Другий параметр, addr, містить покажчик на структуру з адресою, а третій - довжину цієї структури. p align="justify"> Установка з'єднання на стороні сервера складається з чотирьох етапів. Спочатку сокет створюється і прив'язується до локального адресою. Якщо комп'ютер має кілька мережевих інтерфейсів з різними IP-адресами, то можна приймати з'єднання тільки з одного з них, передавши його адресу функції bind. Якщо ж є потреба з'єднуватися з клієнтами через будь-який інтерфейс, необхідно задати в якості адреси константу INADDR_ANY. Що стосується номера порту, то можна задати конкретний номер або 0 (у цьому випадку система сама вибере довільний закинутий в даний момент номер порту). p align="justify"> На наступному кроці створюється черга запитів на з'єднання. При цьому сокет переводиться в режим очікування запитів з боку клієнтів. Все це виконує функція
listen (int sockfd, int backlog);
Перший параметр - дескриптор сокета, а другий задає розмір черги запитів. Кожен раз, коли черговий клієнт намагається з'єднатися з сервером, його запит ставиться в чергу, оскільки сервер може бути зайнятий обробкою інших запитів. Якщо чергу заповнена, всі наступні запити будуть ігноруватися. Коли сервер готовий обслужити черговий запит, він використовує функцію
int accept (int sockfd, void * addr, int * addrlen);
Функція accept створює для спілкування з клієнтом ...