Реализация программы NetServer в примере net2

Реализация программы NetServer идентична реализации серверной сущности в примере net.

netserver.c

#include <netinet/in.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/select.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <unistd.h>

#define EXAMPLE_PORT 1106

#define MAX_PENDING_CONNECTIONS 10

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

{

/* Создаем сокет, принимающий запросы на входящие соединения. */

int serverSocketFD = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (-1 == serverSocketFD)

{

perror("can not create socket");

return EXIT_FAILURE;

}

int optval = 1;

if (-1 == setsockopt(serverSocketFD, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)))

{

perror("error setsockopt failed");

close(serverSocketFD);

return EXIT_FAILURE;

}

/* Создаем структуру адреса сокета и инициализируем ее. */

struct sockaddr_in stSockAddr;

memset(&stSockAddr, 0, sizeof(stSockAddr));

stSockAddr.sin_family = AF_INET;

stSockAddr.sin_port = htons(EXAMPLE_PORT);

stSockAddr.sin_addr.s_addr = htonl(INADDR_ANY);

/* Связываем сокет с локальным адресом протокола. */

if (-1 == bind(serverSocketFD,(struct sockaddr *)&stSockAddr, sizeof(stSockAddr)))

{

perror("error bind failed");

close(serverSocketFD);

return EXIT_FAILURE;

}

/* Переводим сокет в пассивное состояние для принятия запроса на входящее соединение. */

if (-1 == listen(serverSocketFD, MAX_PENDING_CONNECTIONS))

{

perror("error listen failed");

close(serverSocketFD);

return EXIT_FAILURE;

}

{

fd_set readset;

FD_ZERO(&readset);

FD_SET(serverSocketFD, &readset);

/* Ожидаем готовности сокета принять входящий запрос на соединение. */

if (select(serverSocketFD + 1, &readset, NULL, NULL, NULL) == 1)

{

/* Принимаем входящий запрос на соединение и получаем сокет для работы с ним. */

int ConnectFD = accept(serverSocketFD, NULL, 0);

if (0 > ConnectFD)

{

perror("error accept failed");

close(serverSocketFD);

return EXIT_FAILURE;

}

char buf[1024];

/* Читаем данные из входящего соединения. */

if (-1 == read(ConnectFD, buf, sizeof(buf)))

{

perror("recv failed");

close(ConnectFD);

close(serverSocketFD);

return EXIT_FAILURE;

}

else

{

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

fprintf(stdout, "Server received: %s", buf);

}

/* Закрываем входящее соединение. */

if (-1 == shutdown(ConnectFD, SHUT_RDWR))

{

perror("can not shutdown socket");

close(ConnectFD);

close(serverSocketFD);

return EXIT_FAILURE;

}

/* Закрываем сокет, обрабатывающий входящее соединение. */

close(ConnectFD);

}

else

{

/* В случае ошибки закрываем serverSocketFD. */

close(serverSocketFD);

return EXIT_FAILURE;

}

}

/* Завершаем обработку запросов на входящие соединения. */

shutdown(serverSocketFD, SHUT_RDWR);

close(serverSocketFD);

return EXIT_SUCCESS;

}

В начало