Чтение онлайн

на главную - закладки

Жанры

UNIX: разработка сетевых приложений
Шрифт:

ftps 990/tcp # ftp protocol, control, over TLS/SSL

Следующая функция,

getservbyport
, ищет службу по заданному номеру порта и (не обязательно) протоколу.

#include <netdb.h>

struct servent *getservbyport(int port, const char * protname);

Возвращает: непустой указатель
в случае успешного выполнения, NULL в случае ошибки

Значение аргумента

port
должно быть записано в сетевом порядке байтов. Типичные примеры вызова этой функции приведены ниже:

struct servent *sptr;

sptr = getservbyport(htons(53), "udp"); /* DNS с использованием UDP */

sptr = getservbyport(htons(21), "tcp"); /* FTP с использованием TCP */

sptr = getservbyport(htons(21), NULL); /* FTP с использованием TCP */

sptr = getservbyport(htons(21), "udp"); /* этот вызов приведет к ошибке */

Последний вызов оказывается неудачным, поскольку нет службы, использующей порт 21 с протоколом UDP.

Помните, что некоторые номера портов используются с TCP для одной службы, а с UDP — для совершенно другой, например:

freebsd % grep 514 /etc/services

shell 514/tcp cmd #like exec, but automatic

syslog 514/udp

Здесь показано, что порт 514 используется командой

rsh
с TCP и демоном
syslog
с UDP. Это характерно для портов 512-514.

Пример: использование функций gethostbyname и getservbyname

Теперь мы можем изменить код нашего TCP-клиента времени и даты, показанный в листинге 1.1, так, чтобы использовать функции

gethostbyname
и
getservbyname
и принимать два аргумента командной строки: имя узла и имя службы. Наша программа показана в листинге 11.2. Эта программа также демонстрирует желательное поведение при установлении соединения со всеми IP-адресами сервера на узле, имеющем несколько сетевых интерфейсов: попытки продолжаются до тех пор, пока соединение не будет успешно установлено или пока не будут перебраны все адреса.

Листинг 11.2. Наш клиент времени и даты, использующий функции gethostbyname и getservbyname

//names/daytimetcpcli1.c

1 #include "unp.h"

2 int

3 main(int argc, char **argv)

4 {

5 int sockfd, n;

6 char recvline[MAXLINE + 1];

7 struct sockaddr_in servaddr;

8 struct in_addr **pptr;

9 struct in_addr *inetaddrp[2];

10 struct in_addr inetaddr;

11 struct hostent *hp;

12 struct servent *sp;

13 if (argc != 3)

14 err_quit("usage: daytimetcpcli1 <hostname> <service>");

15 if ((hp = gethostbyname(argv[1])) == NULL) {

16 if (inet_aton(argv[1], &inetaddr) == 0) {

17 err_quit("hostname error for %s: %s", argv[1],

18 hstrerror(h_errno));

19 } else {

20 inetaddrp[0] = &inetaddr;

21 inetaddrp[1] = NULL;

22 pptr = inetaddrp;

23 }

24 } else {

25 pptr = (struct in_addr**)hp->h_addr_list;

26 }

27 if ((sp = getservbyname(argv[2], "tcp")) == NULL)

28 err_quit("getservbyname error for %s", argv[2]);

29 for (; *pptr != NULL; pptr++) {

30 sockfd = Socket(AF_INET, SOCK_STREAM, 0);

31 bzero(&servaddr, sizeof(servaddr));

32 servaddr.sin_family = AF_INET;

33 servaddr.sin_port = sp->s_port;

34 memcpy(&servaddr.sin_addr, *pptr, sizeof(struct in_addr));

35 printf("trying %s\n", Sock_ntop((SA*)&servaddr, sizeof(servaddr)));

36 if (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) == 0)

37 break; /*
успешное завершение */

38 err_ret("connect error");

39 close(sockfd);

40 }

41 if (*pptr == NULL)

42 err_quit("unable to connect");

43 while ((n = Read(sockfd, recvline, MAXLINE)) > 0) {

44 recvline[n] = 0; /* null terminate */

45 Fputs(recvline, stdout);

Поделиться:
Популярные книги

Предатель. Цена ошибки

Кучер Ая
Измена
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Предатель. Цена ошибки

Вечный. Книга V

Рокотов Алексей
5. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга V

Мимик нового Мира 13

Северный Лис
12. Мимик!
Фантастика:
боевая фантастика
юмористическая фантастика
рпг
5.00
рейтинг книги
Мимик нового Мира 13

Идеальный мир для Лекаря 15

Сапфир Олег
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15

Чужой ребенок

Зайцева Мария
1. Чужие люди
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Чужой ребенок

Новый Рал 3

Северный Лис
3. Рал!
Фантастика:
попаданцы
5.88
рейтинг книги
Новый Рал 3

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Возвышение Меркурия. Книга 12

Кронос Александр
12. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 12

Провинциал. Книга 5

Лопарев Игорь Викторович
5. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Провинциал. Книга 5

Польская партия

Ланцов Михаил Алексеевич
3. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Польская партия

Бальмануг. (Не) Любовница 1

Лашина Полина
3. Мир Десяти
Фантастика:
юмористическое фэнтези
попаданцы
5.00
рейтинг книги
Бальмануг. (Не) Любовница 1

Чиновникъ Особых поручений

Кулаков Алексей Иванович
6. Александр Агренев
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чиновникъ Особых поручений

Последний попаданец 2

Зубов Константин
2. Последний попаданец
Фантастика:
юмористическая фантастика
попаданцы
рпг
7.50
рейтинг книги
Последний попаданец 2

Черный Маг Императора 7 (CИ)

Герда Александр
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)