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