Реализация сокетов - C (СИ)
Формулировка задачи:
Товарищи, подскажите что да как с сокетами в Си. Ибо пытаюсь сам разобратся по статье из вики, компилятор не воспринимает #include <sys/socket.h> Может что есть почитать на эту тему поподробнее?) Вот сама статья : https://ru.wikipedia.org/wiki/%D0%A1...BA%D0%BB%D0%B8
Решение задачи: «Реализация сокетов»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #define PRINTNUSERS if (nclients)\ printf("%d user on-line\n",nclients);\ else printf("No User on line\n"); int nclients = 0; int main() { int i_error=0;//переменная для проверки на ошибки char buff[1024]; //настройка библиотеки Ws2_32.dll WSADATA WsaData;//определяем переменную i_error = WSAStartup (MAKEWORD(2,2), (WSADATA *) &buff[0]);//настраиваем if (i_error)//проверка на успешность настройки { printf("ERROR!\n"); } else { printf("Biblioteka uspehno nastroena!\n"); } //создание серверного сокета SOCKET s;//создаем прототип s = socket(AF_INET, SOCK_STREAM, 0); if(s==-1) { printf("ERROR!\n"); } else { printf("Soket uspehno sozdan!\n"); } //Привязка к локальным именам struct sockaddr_in adr;//создаем протатип(addr), структуры sockaddr_in adr.sin_family=AF_INET; adr.sin_port=htons(3000); adr.sin_addr.s_addr=htonl(INADDR_ANY);//INADDR_ANY сервер работает НА машине, с любым ip i_error=0;//очистка переменной для ошибок i_error=bind (s,(SOCKADDR*) &adr, sizeof (adr)); if(i_error==-1) { printf("ERROR! Soket ne sviazan c IP\n"); } else { printf("Soket uspehno sviazan!\n"); } //Инициализация процесса «прослушивания» порта printf("Inicializacia processa prosluhivania\n"); if(listen (s,0x100 )){ printf("Error listen %d\n",WSAGetLastError()); closesocket(s); WSACleanup(); return -1; } else{ printf("Listen ok"); } //подключение клиента - Получение дескриптора клиентского соединения SOCKET ClientSock; struct sockaddr_in addr_klienta; int size_client_addr=sizeof(addr_klienta); while((ClientSock=accept(s,(SOCKADDR*)&addr_klienta,&size_client_addr))){ nclients++; HOSTENT *hst; hst=gethostbyaddr((char *) &addr_klienta.sin_addr.s_addr,4, AF_INET); // вывод сведений о клиенте printf("+%s [%s] new connect!\n", (hst)?hst->h_name:"", inet_ntoa(addr_klienta.sin_addr)); PRINTNUSERS DWORD thID; SOCKET my_sock; my_sock=((SOCKET *) ClientSock)[0]; char buff[20*1024]; #define sHELLO "Hello, Sailor\r\n" // отправляем клиенту приветствие send(my_sock,sHELLO,sizeof(sHELLO),0); int bytes_recv; while( (bytes_recv= recv(my_sock,&buff[0],sizeof(buff),0)) && bytes_recv !=SOCKET_ERROR) send(my_sock,&buff[0],bytes_recv,0); nclients--; printf("-disconnect\n"); PRINTNUSERS closesocket(my_sock); } return 0; }
Объяснение кода листинга программы
- Объединение кода с постановкой задачи: Реализация сокетов.
- Описание переменных:
- nclients - количество клиентов в онлайне;
- i_error - переменная для проверки на ошибки;
- buff - буфер для обмена данными;
- s - сокет сервера;
- adr - структура sockaddr_in для привязки к локальному имени;
- ClientSock - сокет клиента;
- addr_klienta - структура sockaddr_in для адреса клиента;
- hst - структура hostent для получения имени хоста по IP;
- my_sock - сокет для обмена данными с клиентом;
- sHELLO - приветственное сообщение для отправки клиенту.
- Последовательность выполнения кода:
- Настройка библиотеки Ws2_32.dll и инициализация WSAData.
- Создание серверного сокета и его привязка к локальному имени.
- Инициализация процесса прослушивания порта.
- Принятие подключения клиента и увеличение счетчика клиентов.
- Получение имени хоста клиента и его IP-адреса.
- Отправка приветственного сообщения клиенту.
- В цикле получение данных от клиента и их отправка обратно.
- Уменьшение счетчика клиентов и закрытие соединения с клиентом.
- Повторение пункта 4 до прекращения работы сервера.
- Описание функций:
- WSAStartup - настройка библиотеки Ws2_32.dll;
- socket - создание серверного сокета;
- bind - привязка сокета к локальному имени;
- listen - инициализация процесса прослушивания порта;
- accept - принятие подключения клиента;
- gethostbyaddr - получение имени хоста по IP-адресу;
- recv - получение данных от клиента;
- send - отправка данных клиенту;
- closesocket - закрытие сокета;
- WSACleanup - очистка ресурсов, выделенных для работы с сокетами;
-
define - определение макроса для размера приветственного сообщения.
- Код содержит комментарии к каждой операции и проверку на ошибки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д