Linux. Полное руководство.

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

Программа-клиент несколько проще, чем сервер. Вот ее листинг:

Листинг 27.4. Программа-клиент.

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <memory.h>

#include <stdio.h>

#define SERVER_HOST "localhost".

#define SERVER_PORT 1234.

#define CLIENT_PORT 1235.

#define MSG "Denis\n".

Main() {

 int sock;

 int ans_len;

 int BUF_SIZE = 64;

 char buffer[BUF_SIZE];

 struct hostent *h;

 struct sockaddr_in client, server;

 sock = socket(AF_INET, SOCK_STREAM, 0);

 memset((char *)&client, '\0', sizeof(client));

 client.sin_family = AF_INET;

 client.sin_addr.s_addr = INADDR_ANY;

 client.sin_port = CLIENT_PORT;

 bind(sock, (struct sockaddr *)&client, sizeof(client));

 memset((char *)&client, '\0', sizeof(server));

 h = gethostbyname(SERVER_HOST);

 server.sin_family = AF_INET;

 memcpy((char *)&server.sin_addr.h->h_addr, h->h_length);

 server.sin_port = SERVER_PORT;

 connect(sock, &server, sizeof(server));

 ans_len = recv(sock, buffer, BUF_SIZE, 0);

 write(1, buffer, ans_len);

 send(sock, MSG, sizeof(MSG), 0);

 close(sock);

 exit(0);

}

Константа MSG — это сообщение, которое будет передано серверу. Как и в случае с сервером, нам понадобятся две структуры типа sockaddr_in:

Struct hostent *h;

Struct sockaddr_in client, server;

Структура типа hostent нам нужна для получения адреса сервера.

Создаем сокет, заполняем информацию о клиенте и связываем сокет:

Sock = socket(AF_INET, SOCK_STREAM, 0);

Memset((char *)&client, '\0' , sizeof(client));

Client.sin_family = AF_INET;

Client.sin_addr.s_addr = INADDR_ANY;

Client.sin_port = CLIENT_PORT;

Bind(sock, (struct sockaddr *)&client, sizeof(client));

Перед подключением к серверу нужно определить его IP-адрес:

H = gethostbyname(SERVER_HOST);

Подключаемся к серверу:

Server.sin_family = AF_INET; // набор протоколов.

Memcpy((char *)&server.sin_addr, h->h_addr, h->h_length);

// задаем адрес сервера.

Server.sin_port = SERVER_PORT; // указываем порт сервера.

Connect(sock, &server, sizeof(server));

После подключения к серверу принимаем его запрос, выводим на стандартный вывод, отправляем серверу свое сообщение и закрываем сокет:

Ans_len = recv(sock, buffer, BUF_SIZE, 0);

Write(1, buffer, ans_len);

Send(sock, MSG, sizeof(MSG), 0);

Close(sock);