/* Пример простого TCP-сервера для сервиса echo */
#include
#include
#include
#include
#include
#include
#include
#include
void main()
{
int sockfd, newsockfd; /* Дескрипторы для
слушающего и присоединенного сокетов */
int clilen; /* Длина адреса клиента */
int n; /* Количество принятых символов */
char line[1000]; /* Буфер для приема информации */
struct sockaddr_in servaddr, cliaddr; /* Структуры
для размещения полных адресов сервера и
клиента */
/* Создаем TCP-сокет */
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
perror(NULL);
exit(1);
}
/* Заполняем структуру для адреса сервера: семейство
протоколов TCP/IP, сетевой интерфейс – любой, номер
порта 51000. Поскольку в структуре содержится
дополнительное не нужное нам поле, которое должно
быть нулевым, побнуляем ее всю перед заполнением */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family= AF_INET;
servaddr.sin_port= htons(51000);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
/* Настраиваем адрес сокета */
if(bind(sockfd, (struct sockaddr *) &servaddr,
sizeof(servaddr)) < 0){
perror(NULL);
close(sockfd);
exit(1);
}
/* Переводим созданный сокет в пассивное (слушающее)
состояние. Глубину очереди для установленных
соединений описываем значением 5 */
if(listen(sockfd, 5) < 0){
perror(NULL);
close(sockfd);
exit(1);
}
/* Основной цикл сервера */
while(1){
/* В переменную clilen заносим максимальную
длину ожидаемого адреса клиента */
clilen = sizeof(cliaddr);
/* Ожидаем полностью установленного соединения
на слушающем сокете. При нормальном завершении
у нас в структуре cliaddr будет лежать полный
адрес клиента, установившего соединение, а в
переменной clilen – его фактическая длина. Вызов
же вернет дескриптор присоединенного сокета, через
который будет происходить общение с клиентом.
Заметим, что информация о клиенте у нас в
дальнейшем никак не используется, поэтому
вместо второго и третьего параметров можно
было поставить значения NULL. */