Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_UNIX_15_19_окт2004.doc
Скачиваний:
4
Добавлен:
27.04.2019
Размер:
478.72 Кб
Скачать

Тексти програм servertcp та clienttcp

Лістинг 1

servertcp:

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <fcntl.h>

#include <netdb.h>

#include <errno.h>

/*Номер порту сервера, відомий клієнтам*/

#define PORTNUM 1500

int main(int argc, char* argv[])

{

int s, ns, pid, nport;

struct sockaddr_in serv_addr, clnt_addr;

struct hostent *hp;

char buf[80], hname[80];

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

nport = PORTNUM;

nport = htons((u_short)nport);

/*Створімо сокет, який використовує протокол ТСР*/

if((s = socket(AF_INET, SOCK_STREAM, 0)) == -1){

perror("Pomylka vyklyku socket()");

exit(1);

}

/*Задамо адресу комунікаційного вузла*/

bzero(&serv_addr, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = INADDR_ANY;

serv_addr.sin_port = nport;

/*Зв'яжемо сокет з цією адресою*/

if(bind(s, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1){

perror("Pomylka vyklyku bind()");

exit(1);

}

/*Передамо повідомлення із зазначенням адреси сервера*/

fprintf(stderr, "Server gotov: %s\n", inet_ntoa(serv_addr.sin_addr));

/*Сервер готовий приймати запити на встановлення з'єднання. Максимальна кількість запитів, які очікують на опрацювання - 5. Як правило, цієї кількості вистачає, щоби встигнути виконати ассерt(2) та породити дочірній процес*/

if(listen(s, 5) == -1){

perror("Pomylka vyklyku listen()");

exit(1);

}

/*Нескінченний цикл отримування запитів та їхнього опрацьовування*/

while(1){

int addrlen;

bzero(&clnt_addr, sizeof(clnt_addr));

addrlen = sizeof(clnt_addr);

/*Приймемо запит. Новий сокет ns стає комунікаційним вузлом створеного віртуального каналу*/

if((ns = accept(s, (struct sockaddr*) &clnt_addr, &addrlen)) ==

-1){

perror("Pomylka vyklyku accept()");

exit(1);

}

/*Виведемо інформацію про клієнта*/

fprintf(stderr, "Client = %s\n", inet_ntoa(clnt_addr.sin_addr));

if((pid = fork()) == -1){

perror("Pomylka vyklyku fork()");

exit(1);

}

if(pid == 0){

int nbytes, fout;

/*Дочірній процес: цей сокет нам не потрібен. Він використовується, як і раніше, для отримання запитів*/

close(s);

/*Отримаємо повідомлення від клієнта й повернемо його назад*/

while((nbytes = recv(ns, buf, sizeof(buf), 0)) != 0){

send(ns, buf, sizeof(buf), 0);

}

close(ns);

exit(0);

}

/*Батьківський процес: цей сокет нам не потрібен. Він використовується дочірнім процесом для обміну даними*/

close(ns);

}

}

Лістинг 2

clienttcp:

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdio.h>

#include <fcntl.h>

#include <netdb.h>

#include <errno.h>

/*Номер порту, який обслуговується сервером*/

#define PORTNUM 1500

int main(int argc, char* argv[])

{

int s, pid, i, j;

struct sockaddr_in serv_addr;

struct hostent *hp;

char buf[80] = "Hello, World!\n";

/*Клієнтові як аргумент передається доменне ім'я хоста, на якому запущено сервер. Доменне ім'я транслюється у адресу*/

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

{

perror("Pomylka vyklyku gethostbyname()");

exit(3);

}

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);

/*Створімо сокет*/.

if((s = socket(AF_INET, SOCK_STREAM, 0)) == -1){

perror("Pomylka vyklyku socket()");

exit(1);

}

fprintf(stderr, "Addresa clienta: %s\n", inet_ntoa(serv_addr.sin_addr));

/*Створімо віртуальний канал*/

if(connect(s, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) ==

-1){

perror("Pomylka vyklyku connect()");

exit(1);

}

/*Передамо серверові повідомлення й отримаємо його назад*/

send(s, buf, sizeof(buf), 0);

if(recv(s, buf, sizeof(buf), 0) < 0){

perror("Pomylka vyklyku recv()");

exit(1);

}

/*Виведемо отримане повідомлення на екран*/

printf("Otrymano vid servera: %s\n", buf);

close(s);

printf("Client zavershyv robotu \n\n");

}

ДОДАТОК Г

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]