Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ShPORY.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
277 Кб
Скачать
☆

Закрытие сокета

Закончив обмен данными, закройте сокет с помощью функции close. Это приведёт к разрыву соединения.

#include <unistd.h>

int close(int fd);

Вы также можете запретить передачу данных в каком-то одном направлении, используя shutdown.

int shutdown(int sockfd, int how);

Параметр how может принимать одно из следующих значений:

  • 0 - запретить чтение из сокета

  • 1 - запретить запись в сокет

  • 2 - запретить и то и другое

Хотя после вызова shutdown с параметром how, равным 2, вы больше не сможете использовать сокет для обмена данными, вам всё равно потребуется вызвать close, чтобы освободить связанные с ним системные ресурсы.

46) Socket api. Неблокирующие сокеты. Пример реализации tcp- сервера.

Socket API: Интерфейс сокета Беркли — API, позволяющий реализовывать взаимодействие между компьютерами или между процессами на одном компьютере. Данная технология может работать со множеством различных устройств ввода-вывода и драйверов, несмотря на то, что их поддержка зависит от реализации операционной системы. Подобная реализация интерфейса лежит в основе TCP/IP, благодаря чему считается одной из фундаментальных технологий, на которых основывается Интернет. Технология сокетов впервые была разработана в Калифорнийском университете Беркли для применения на UNIX системах. Все современные операционные системы имеют ту или иную реализацию интерфейса сокетов Беркли, так как это стало стандартным интерфейсом для подключения к сети Интернет.

Программисты могут получать доступ к интерфейсу сокетов на трёх различных уровнях, наиболее мощным и фундаментальным из которых является уровень сырых сокетов. Довольно небольшое число приложений нуждается в ограничении контроля над исходящими соединениями, реализуемыми ими, поэтому поддержка сырых сокетов задумывалась быть доступной только на компьютерах, применяемых для разработки на основе технологий, связанных с Интернет. Впоследствии в большинстве операционных систем была реализована их поддержка, включая Windows XP

Неблокирующие сокеты: Неблокирующий режим: В данном режиме выполнение операций с сокетом не приостанавливает работу приложения. О завершении работы функций приложение уведомляется. Данный режим реализован как альтернатива блокирующему режиму в потоке (т.е. при данном режиме поток попросту бесполезен). Так как уведомление о завершении выполнения приходило позже, то для реализациии получения данного уведомления, программист должен был озаботится о механизме - который и будет принимать данное уведомления. Вот тут уже и начинаются понятия ООП, такие как события (OnWrite, OnRead и т.д.).

Пример реализации TCP- сервера:

#include <sys/socket.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <stdlib.h>

#include <unistd.h>

#include <string.h>

#include <iostream>

#include <fstream>

using namespace std;

void reverse(char s[])

{

int i, j;

char c;

for (i = 0, j = strlen(s)-1; i<j; i++, j--) {

c = s[i];

s[i] = s[j];

s[j] = c;

}

}

void itoa(unsigned int n, char s[])

{

int i;

i = 0;

do { /* генерируем цифры в обратном порядке */

s[i++] = n % 10 + '0'; /* берем следующую цифру */

} while ((n /= 10) > 0); /* удаляем */

s[i] = '\0';

reverse(s);

}

/* reverse: переворачиваем строку s на месте */

int main()

{

int sock, lis;

sockaddr_in addr;

socklen_t addr_size = sizeof(addr);

char buf[1024], mes[100];

char buf_p[1024];

int bytes_read, p=0;

char *res;

socklen_t size;

lis = socket(AF_INET, SOCK_STREAM, 0);

if(lis<0){printf("socket"); exit(1);}

addr.sin_family = AF_INET;

addr.sin_port = htons(3425);

addr.sin_addr.s_addr = htonl(INADDR_ANY);

if(bind(lis, (struct sockaddr *)&addr, sizeof(addr))<0)

{printf("bind");

exit(2);}

listen(lis, 1);

while(1)

{

sock = accept(lis, (struct sockaddr*)&addr, &size);

if(sock < 0)

{

printf("accept");

exit(3);

}

while(1)

{

recvfrom(sock, &buf[0], 1024, 0, (struct sockaddr *) &addr, &addr_size);

ifstream f("file.txt");

while(!f.eof()){

f >> mes;

if(strstr(mes, buf)) {p++;}

}

itoa(p, buf_p);

sendto(sock, &buf_p[0], bytes_read, 0, (struct sockaddr*) &addr, sizeof(addr));

}

close(sock);

}

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]