Visual C++ для начинающих
Страница 46. Программа-клиент


5.2. Программа-клиент 

Текст программы-клиента на языке программирования СИ выглядит следующим образом

 1 #include <sys/types.h>
2 #include <sys/socket.h>
3 #include <netinet/in.h>
4 #include <netdb.h>
5 #include <memory.h>
6 #define SRV_HOST "delta"
7 #define SRV_PORT 1234
8 #define CLNT_PORT 1235
9 #define BUF_SIZE 64
10 #define TXT_ANSW "I am your client\n"
11 main () {
12 int s;
13 int from_len;
14 char buf[BUF_SIZE];
15 struct hostent *hp;
16 struct sockaddr_in clnt_sin, srv_sin;
17 s = socket (AF_INET, SOCK_STREAM, 0);
18 memset ((char *)&clnt_sin, '\0', sizeof(clnt_sin));
19 clnt_sin.sin_family = AF_INET;
20 clnt_sin.sin_addr.s_addr = INADDR_ANY;
21 clnt_sin.sin_port = CLNT_PORT;
22 bind (s, (struct sockaddr *)&clnt_sin, sizeof(clnt_sin));
23 memset ((char *)&srv_sin, '\0', sizeof(srv_sin));
24 hp = gethostbyname (SRV_HOST);
25 srv_sin.sin_family = AF_INET;
26 memcpy ((char *)&srv_sin.sin_addr,hp->h_addr,hp->h_length);
27 srv_sin.sin_port = SRV_PORT;
28 connect (s, &srv_sin, sizeof(srv_sin));
29 from_len = recv (s, buf, BUF_SIZE, 0);
30 write (1, buf, from_len);
31 send (s, TXT_ANSW, sizeof(TXT_ANSW), 0);
32 close (s);
33 exit (0);
34 }
  • В строках
  •  6 и 7 описываются константы SRV_HOST и SRV_PORT, определяющие имя удаленного узла, на котором функционирует программа-сервер, и номер порта, к которому привязан socket сервера.
  • Строка 8 приписывает целочисленной константе 1235 символическое имя CLNT_PORT. В дальнейшем эта константа будет использована в качестве номера порта клиента.
  • В строках 17...22 создается привязанный к порту на локальном узле socket.
  • В строке 24 посредством библиотечной функции gethostbyname транслируется символическое имя удаленного узла (в данном случае "delta"), на котором должен функционировать сервер, в адрес этого узла, размещенный в структуре типа hostent.
  • В строке 26 адрес удаленного узла копируется из структуры типа hostent в соответствующее поле структуры srv_sin, которая позже (в строке 28) используется в системном вызове connect для идентификации программы-сервера.
  • В строках 29...31 осуществляется обмен данными с сервером и вывод вопроса, поступившего от сервера, в стандартный вывод.
  • Строка 32 посредством системного вызова close закрывает (удаляет) socket.

 

 
« Предыдущая статья   Следующая статья »