Вход/Регистрация
Операционная система UNIX
вернуться

Робачевский Андрей Михайлович

Шрифт:

с клиентом */

t_close(ntn);

 }

 t_close(ntn);

}

Клиент

#include <sys/types.h>

#include <sys/socket.h>

#include <tiuser.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <fcntl.h>

#include <netdb.h>

#define PORTNUM 1500

main(argc, argv)

char *argv[];

int argc;

{

 int tn;

 int flags;

 struct sockaddr_in serv_addr;

 struct hostent *hp;

 char buf[80]="Здравствуй, мир!";

 struct t_call* call;

 /* В качестве аргумента клиенту передается доменное имя хоста,

на котором запущен сервер. Произведем трансляцию доменного

имени в адрес */

 if ((hp = gethostbyname(argv[1])) == 0) {

perror("Ошибка вызова gethostbyname");

exit(1);

 }

 /* Создадим транспортный узел. В качестве поставщика

транспортных услуг выберем модуль TCP */

 printf("Сервер готов\n");

 if ((tn = t_open("/dev/tcp", O_RDWR, NULL)) == -1) {

t_error("Ошибка вызова t_open");

exit(1);

 }

 /* Предоставим системе самостоятельно связать узел с

подходящим адресом */

 if (t_bind(tn, (struct t_bind*)0,

(struct t_bind *)0) < 0} {

t_error("Ошибка вызова t_bind");

exit(1);

 }

 fprintf(stderr, "Адрес клиента: %s\n",

inet_ntoa(serv_addr.sin_addr));

 /* Укажем адрес сервера, с которым мы будем работать */

 bzero(&serv_addr, sizeof(serv_addr));

 bcopy(hp->h_addr, &serv_addr.sin_addr, hp->h_length);

 serv_addr.sin_family = hp->h_addrtype;

 /* Приведем в соответствие порядок следования байтов

для хоста и сети */

 serv_addr.sin_port = htons(PORTNUM);

 /* Поскольку в структуре t_call нам понадобится только буфер

для хранения адреса сервера, разместим ее динамически */

 if ((call =

(struct t_call*)t_alloc(tn, T_CALL, T_ADDR)) == NULL) {

t_error("Ошибка вызова t_alloc");

exit(2);

 }

 call->addr.maxlen = sizeof(serv_addr);

 call->addr.len = sizeof(serv_addr);

 call->addr.buf = (char*)&serv_addr;

 call->opt.len = 0;

 call->udata.len = 0;

 /* Установи соединение с сервером */

 if (t_connect(tn, call, (struct t_call*)0) == -1) {

t_error("Ошибка вызова t_rcv");

exit(1);

 }

 /* Передадим сообщение и получим ответ */

 t_snd(tn, buf, sizeof(buf), 0);

 if (t_rcv(tn, buf, sizeof(buf), &flags) < 0) {

t_error("Ошибка вызова t_rcv");

exit(1);

 }

 /* Выведем полученное сообщение на экран */

 printf("Получено от сервера: %s\n", buf);

 printf("Клиент завершил работу!\n\n");

  • Читать дальше
  • 1
  • ...
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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