русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Лістинг 1


Дата додавання: 2014-11-28; переглядів: 801.


 

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

}

}


<== попередня лекція | наступна лекція ==>
Мова програмування awk | TPageControl


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн