logo
Проектирование инт-прил / лекции / Проектирование инет приложений

Создание серверной сокеты (пример на языке c).

Далее приведен отрывок из простейшего приложения архитектуры "клиент-сервер", то есть двухуровневого сетевого приложения. Полностью просмотреть тексты программ, самостоятельно откомпилировать их и запустить можно, воспользовавшись Приложениями к данному курсу. Здесь приводится только суть, а по сути работа серверной части по созданию сокеты сводится к четырем шагам:

// Создаем сокету. Дескриптор на сокету выдается функцией

// операционной системы socket(). При этом указывается семейство

// допустимых для сокеты протоколов, ее тип. Последний параметр -

// "протокол" - в нашем случае не имеет смысла, так как два первых

// однозначно указывают на tcp/ip.

int sock_fd = socket( AF_INET, SOCK_STREAM, 0 );

// Заполняем адресную стуктуру для связывания сокеты с конкретным

// набором протокол-порт. Семейство протоколов - INET,

// порт определен в файлике common.h, в качестве адреса

// используем адрес локального интерфейса (127.0.0.1)

address.sin_family=AF_INET;

address.sin_port = htons(DEMO_PORT);

address.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

// "Связывание" сокеты. Вызов функции сообщает операционной

// системе, с каким адресом, протоколом и портом будет связана

// только что созданная сокета.

if ( bind( sock_fd, (struct sockaddr *) &address, sizeof(address) ) != 0 ) {

// Попытка связывания оказалась неудачной. Вполне возможно, уже есть

// процесс, слушающий данное сочетание порт-протокол.

perror("Bind:");

exit(2);

};

// На этом операторе выполнение программы будет приостановлено

// - до тех пор, пока не придет какой-нибудь клиент.

listen(sock_fd, 1 );

// Когда сервер готов обслужить очередной запрос на соединение, он

// использует функцию accept(). Результатом работы будет - другой дескриптор,

// описывающий уже конкретное клиентское соединение.

client_fd = accept(sock_fd, (struct sockaddr *) &client_addr, &len );