Реализация программы 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;
}
В начало