Использование функции getockname в C

В то время как разработка пользовательского программного обеспечения Программирование и разработка

Программирование сокетов хорошо известно и распространено в программировании на C между разработчиками и пользователями. В рамках такого программирования мы склонны соединять две конечные точки. Этими конечными точками могут быть два сервера, один сервер, один сокет и т. д. Как следует из названия, функция «getsockname» используется для получения имени сокета, работающего в сети. Это может быть или не быть именем сокета, но с помощью этой функции будет отображаться адрес этого конкретного сокета. Поэтому в этом руководстве мы попробовали простой способ проиллюстрировать функцию getsockname() на языке C. Давайте по-новому взглянем на его пример, работая над программой в системе Ubuntu 20.04 Linux.

Пример: Функция GetSockName

Давайте рассмотрим пример функции getsockname в C. Используйте сочетание клавиш «Ctrl+Alt+T», чтобы быстро открыть приложение командной строки на экране. Это может занять всего 10 секунд, и ваш терминал будет готов к работе. В области инструкций терминала вы должны ввести запрос «touch» вместе с «имя файла», чтобы сгенерировать в вашей системе совершенно новый файл, т. е. пустой. Для открытия этого вновь созданного файла доступно множество вариантов, например, vim, nano или текстовый редактор. Пользователи могут предпочесть сначала открыть его в текстовом редакторе, создать код, обновить или изменить код, а затем выполнить его в оболочке. Это можно сделать, просто дважды нажав на имя файла, находящегося в «домашней» папке проводника. Если пользователи хотят открыть пустой файл в редакторе «GNU Nano», они могут использовать команду терминала «nano». Напишите эту инструкцию и нажмите Enter, чтобы выполнить ее. Перечислены инструкции по созданию и открытию файла:

Используйте сочетание клавиш «Ctrl+Alt+T», чтобы быстро открыть приложение командно

Код C начинается с включения некоторых основных и важных заголовочных файлов. Для этого используется ключевое слово «include» со знаком решётки. Всего здесь используется 11 заголовков. «stdio.h» использовался для получения стандартного ввода и вывода. «unistd.h». используется для доступа к API операционной системы POSIX, т. е. Linux и Unix-подобных систем. Заголовок «stdlib.h» — это стандартная библиотека для общих целей, т. е. для преобразования типов, управления процессами, распределения памяти и т. д. «errno.h» в основном используется для устранения ошибок и создания отчетов. Модуль «string.h» для C используется для обработки строк наряду с некоторыми другими функциями. Заголовок «sys/types.h» используется для определения типов данных переменных и функций, используемых в нашем программном коде.

Читайте также:  Интерполяция строк Ruby

Файл заголовка «sys/stat.h» используется здесь для описания построения возвращаемых информационных данных. Библиотека заголовков «sys/socket.h» будет использоваться для использования функций и изменяемых сокетов в нашем коде. Библиотека заголовков «sys/un.h» предназначена для сохранения адресов Unix-подобных сокетов. «netint/in.h» специально разработан для инициализации типа изменяемой структуры для IPv6-адреса в обратной связи.

Переменные INET ADDRSTRLEN или INET6 ADDRSTRLEN обычно определяются в библиотеке заголовков «arpa/inet.h». После всех файлов заголовков мы реализовали определяемую пользователем функцию с именем «ShowError», принимающую один аргумент постоянного указателя на символ «e». Этот аргумент указателя ссылается на некоторые ошибки, обнаруженные до сих пор в нашем коде. Для языка программирования C метод ошибок POSIX, т. е. perror, используется для отображения ответного сообщения об ошибке на «stderr» в зависимости от состояния ошибки errno. Он выводит «str» и ответное сообщение об ошибке, соответствующее универсальному изменяемому errno, определенному кодом программы. Функция «perror» использует аргумент «e» в качестве сообщения об ошибке, чтобы показать его. Функция «exit(1)» предназначена для выхода или завершения функции «ShowError()» прямо в данный момент:

Функция «perror» использует аргумент «e» в качестве сообщения об ошибке

А вот и функция sock_addr указателя, принимающая в своих параметрах три аргумента. Параметр «s» представляет сокет, а переменная-указатель символьного типа «buf» будет использоваться для хранения в нем данных сокета. В то время как последний аргумент «bufsize» объекта типа «size_t» будет использоваться для определения размера переменной буфера или просто буфера. Внутри этой функции мы создали структуру с именем «addr» для хранения адреса сокета. Длина переменной «addr» была сохранена в переменной целочисленного типа «len» путем применения к ней функции «sizeof».

Здесь использовалась функция getsockname() для получения имени сокета. Эта функция использует сокет, адреса сокета и длину сокета в качестве входных аргументов. Каким бы ни был ответ для функции getsockname, ответ будет сохранен в переменной «z», т. е. собран или нет. Оператор «if» здесь проверяет условие, что переменная «z» получила код состояния возврата как −1, т. е. ложь. Это означает, что если вы обнаружите, что не можете получить имя сокета, он вернет NULL вызывающей функции. Функция «snprintf» используется для получения адреса сокета, преобразования его в строковую форму и отображения в оболочке. Для этого в качестве аргумента необходимо использовать буфер и размер буфера. Адрес порта сокета используется в функции «ntohs» для преобразования его в байт-код хоста:

Читайте также:  Vue.js Composition API Teleport

Здесь использовалась функция getsockname() для получения имени сокета

Функция main() принимает в качестве параметра 4 аргумента. Адресная переменная структурного типа «addr» для сокета объявляется с переменной символьного типа «buf» размера 64. Затем мы создали интернет-сокет Ipv4, используя функцию сокета. Этот статус сокета возвращает код, и он будет сохранен в переменной «sck_inet». Если сокет не создается успешно, например, sck_inet не равен нулю, он вызовет сообщение «ShowError», передав ему простой текст «Socket()».

После этого мы попытались создать адрес «AF_INET». Функция memset() используется для инициализации адреса сокета до 0. Семейство адресов сокетов было инициализировано как «AF_INET», его порт также объявлен, а функция htons здесь для преобразования формата байта хоста в формат сетевого байта.. Функция inet_aton использует локальный IP-адрес для преобразования его в стандартный строковый формат и сохранения в переменной адреса сокета. Размер адресной переменной хранится в переменной «len». Функция bind() привязывает адрес к сокету и сохраняет код возврата состояния в «z». Если код состояния «-1», то есть false, он вызовет сообщение «ShowError» при вызове в нем функции bind(). Если функция «sock_addr()» не может быть вызвана, он также вызовет функцию «ShowError», принимая «sock_addr» в качестве аргумента. Оператор printf показывает имя, хранящееся в буфере:

После этого мы попытались создать адрес «AF

Функция close вызывается для закрытия интернет-сокета Ipv4:

Функция close вызывается для закрытия интернет

После компиляции и выполнения у нас есть имя сокета, на котором подключена наша система:

После компиляции и выполнения у нас есть имя сокета

Вывод

Эта статья действительно нужна каждому пользователю C, жадно ищущему пример «getsockname» в Linux. Мы обсудили один пример в этом руководстве. Мы постарались упростить для наших пользователей, так как код был разделен на куски. Также мы надеемся, что вы найдете эту статью очень полезной. Дополнительные советы и руководства см. в других статьях Linux Hint.

Оцените статью
bestprogrammer.ru
Добавить комментарий