SlideShare uma empresa Scribd logo
1 de 19
Baixar para ler offline
Сокеты
Основы Веб-программирования
Кафедра Интеллектуальных Информационных Технологий, ИнФО, УрФУ
1
Ресурсы
https://ru.wikipedia.org/wiki/Сокеты_Беркли
http:
//lecturesnet.readthedocs.org/net/low-level/index.html
2
Сокет
Сокет — абстрактный объект, представляющий конечную
точку соединения.
В ОС объект сокета представлен файловым дескриптором
и может принимать те же операции что и файл (открытие -
чтение/запись - закрытие).
Дополнительно сокеты имеют операции для связи их с
адресом и подготовки к обмену данными.
3
Типы
• UNIX - для взаимодействия процессов на локальной
машине.
• INET - для взаимодействия по сети.
• WebSocket - протокол напоминающий механизм
сокетов, предназначен для связи браузера с сервером
(в обе стороны).
4
INET типы
• Stream socket - TCP.
• Datagram socket - UDP.
• Raw socket - формируем пакеты вручную.
5
Системный вызов socket
Пример INET сокета типа TCP:
Код 1: Си
#include <sys/types.h>
#include <sys/socket.h>
int sock_fd = socket(AF_INET , SOCK_STREAM , 0);
Код 2: Python
import socket
sock_obj = socket.socket(socket.AF_INET ,
socket.SOCK_STREAM , 0)
6
Основные функции
socket
Создать новый сокет и вернуть файловый де-
скриптор
send Отправить данные по сети
receive Получить данные из сети
close Закрыть соединение
bind Связать сокет с IP-адресом и портом
listen
Объявить о желании принимать соединения.
Слушает порт и ждет когда будет установлено
соединение
accept Принять запрос на установку соединения
connect Установить соединение
7
Клиент. Установка соединения
Со стороны клиента используется функция connect,
которая инициирует установление связи на сокете:
Код 3: Си
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd ,
const struct sockaddr *serv_addr ,
socklen_t addrlen );
Код 4: Python
server_address = ('192.168.1.100 ', 8080)
sock_obj.connect(server_address)
8
Клиент. Установка соединения
Со стороны клиента используется функция connect:
Код 5: Си
#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd ,
const struct sockaddr *serv_addr ,
socklen_t addrlen );
Код 6: Python
server_address = ('192.168.1.100 ', 8080)
sock_obj.connect(server_address)
9
Сервер. Установка соединения
Сервер слушает порт и при запросе от клиента
устанавливает соединение.
10
Сервер. Ждем соединения.
Сервер слушает порт и ожидает запрос на соединение от
клиента:
Код 7: Си
#include <sys/socket.h>
int listen(int sockfd , int backlog );
Код 8: Python
sock_obj.listen (5) # fd = 5
11
Сервер. Подтверждаем соединение.
accept - подтверждает запрос клиента и устанавливает
соединение.
Код 9: Си
#include <sys/types.h>
#include <sys/socket.h>
int accept(int sockfd , struct sockaddr *cliaddr ,
socklen_t *addrlen );
Код 10: Python
conn , addr = sock_obj.accept ()
12
Передача данных
В Python вызов методов send, recv без дополнительных
параметров, аналогичен системным вызовам read, write.
Код 11: Си
#include <sys/types.h>
#include <unistd.h>
ssize_t read(int fd, void *buf , size_t nbytes );
ssize_t write(int fd, const void *buf , size_t nbytes );
Код 12: Python
conn.send('Hello␣World!')
data = conn.recv(BUFFER_SIZE)
13
Сервер TCP на Pyhton
Создаем TCP сокет, который слушает порт 5005 на
локальной машине.
Код 13: Python
import socket
TCP_IP = '127.0.0.1 '
TCP_PORT = 5005
BUFFER_SIZE = 20 # Normally 1024,
# but we want fast response
s = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
s.bind((TCP_IP , TCP_PORT ))
s.listen (1)
14
Сервер TCP на Pyhton
После запроса клиента и установки с ним соединения,
сервер в бесконечном цикле принимает от него данные,
выводит их на экран и возвращает обратно. (Эхо-сервер)
Код 14: Python
conn , addr = s.accept ()
print("Connection␣address:␣{}".format(addr))
while 1:
data = conn.recv(BUFFER_SIZE)
print("received␣data:␣{}".format(data))
conn.send(data) # echo
conn.close()
15
Клиент TCP
TCP соединение всегда можно установить при помощи
утилиты Telnet.
Код 15: Telnet
$ telnet localhost 5005
16
Клиент TCP на Python
Создаем сокет и отправляем запрос на установку
соединения с сервером.
Код 16: Python
import socket
TCP_IP = '127.0.0.1 '
TCP_PORT = 5005
BUFFER_SIZE = 1024
MESSAGE = "Hello ,␣World!"
s = socket.socket(socket.AF_INET , socket.SOCK_STREAM)
s.connect ((TCP_IP , TCP_PORT ))
17
Клиент TCP на Python
Отправляем данные, получаем ответ сервера и закрываем
соединение.
Код 17: Python
s.send(MESSAGE)
data = s.recv(BUFFER_SIZE)
s.close()
print("received␣data:␣{}".format(data))
18
Клиент HTTP на Python
Устанавливаем TCP соединение с httpbin.org и
отправляем строку запроса.
Код 18: Python
sock_obj = socket.socket(socket.AF_INET ,
socket.SOCK_STREAM)
sock_obj.connect (('httpbin.org', 80))
sock_obj.send("GET␣/ip␣HTTP /1.0nn")
19

Mais conteúdo relacionado

Mais procurados

Находим и эксплуатируем уязвимости. Теория и практические примеры уязвимых ре...
Находим и эксплуатируем уязвимости. Теория и практические примеры уязвимых ре...Находим и эксплуатируем уязвимости. Теория и практические примеры уязвимых ре...
Находим и эксплуатируем уязвимости. Теория и практические примеры уязвимых ре...
Kristina Pomozova
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3
Technopark
 
мои модули и патчи для Nginx. максим дунин. зал 1
мои модули и патчи для Nginx. максим дунин. зал 1мои модули и патчи для Nginx. максим дунин. зал 1
мои модули и патчи для Nginx. максим дунин. зал 1
rit2011
 
Web весна 2012 лекция 3
Web весна 2012 лекция 3Web весна 2012 лекция 3
Web весна 2012 лекция 3
Technopark
 
WebCamp: Developer Day: N2O: The Most Powerful Erlang Web Framework - Максим ...
WebCamp: Developer Day: N2O: The Most Powerful Erlang Web Framework - Максим ...WebCamp: Developer Day: N2O: The Most Powerful Erlang Web Framework - Максим ...
WebCamp: Developer Day: N2O: The Most Powerful Erlang Web Framework - Максим ...
GeeksLab Odessa
 
Nginx Igor Sysoev
Nginx   Igor SysoevNginx   Igor Sysoev
Nginx Igor Sysoev
Media Gorod
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Sockets
rit2010
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Sockets
guest092df8
 
Продвинутая web-отладка с Fiddler
Продвинутая web-отладка с FiddlerПродвинутая web-отладка с Fiddler
Продвинутая web-отладка с Fiddler
Alexander Feschenko
 

Mais procurados (20)

Находим и эксплуатируем уязвимости. Теория и практические примеры уязвимых ре...
Находим и эксплуатируем уязвимости. Теория и практические примеры уязвимых ре...Находим и эксплуатируем уязвимости. Теория и практические примеры уязвимых ре...
Находим и эксплуатируем уязвимости. Теория и практические примеры уязвимых ре...
 
Web весна 2013 лекция 3
Web весна 2013 лекция 3Web весна 2013 лекция 3
Web весна 2013 лекция 3
 
мои модули и патчи для Nginx. максим дунин. зал 1
мои модули и патчи для Nginx. максим дунин. зал 1мои модули и патчи для Nginx. максим дунин. зал 1
мои модули и патчи для Nginx. максим дунин. зал 1
 
07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера07 - Web-технологии. Web-сервера
07 - Web-технологии. Web-сервера
 
17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения17 - Web-технологии. Real Time сообщения
17 - Web-технологии. Real Time сообщения
 
Web весна 2012 лекция 3
Web весна 2012 лекция 3Web весна 2012 лекция 3
Web весна 2012 лекция 3
 
WebCamp: Developer Day: N2O: The Most Powerful Erlang Web Framework - Максим ...
WebCamp: Developer Day: N2O: The Most Powerful Erlang Web Framework - Максим ...WebCamp: Developer Day: N2O: The Most Powerful Erlang Web Framework - Максим ...
WebCamp: Developer Day: N2O: The Most Powerful Erlang Web Framework - Максим ...
 
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
Андрей Светлов-«Делаем своё решение для оптимальной загрузки кластера»
 
Nginx Igor Sysoev
Nginx   Igor SysoevNginx   Igor Sysoev
Nginx Igor Sysoev
 
Web sockets
Web socketsWeb sockets
Web sockets
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Sockets
 
Eugene Lisitsky Web Sockets
Eugene Lisitsky Web SocketsEugene Lisitsky Web Sockets
Eugene Lisitsky Web Sockets
 
Алексей Андросов "HTML5 в Я.Почте"
Алексей Андросов "HTML5 в Я.Почте"Алексей Андросов "HTML5 в Я.Почте"
Алексей Андросов "HTML5 в Я.Почте"
 
Продвинутая web-отладка с Fiddler
Продвинутая web-отладка с FiddlerПродвинутая web-отладка с Fiddler
Продвинутая web-отладка с Fiddler
 
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)Elasticsearch(java) fluentbit(c++)    fluentd(ruby) kibana(javascript)
Elasticsearch(java) fluentbit(c++) fluentd(ruby) kibana(javascript)
 
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр ВолковОпенсорс-инструменты на страже безопасности бэкенда — Петр Волков
Опенсорс-инструменты на страже безопасности бэкенда — Петр Волков
 
Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...
Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...
Шамбулов У. К. (Казахстан), ГТС. Анализ и исследование инцидентов информацион...
 
01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений01 - Web-технологии. Архитектура Web приложений
01 - Web-технологии. Архитектура Web приложений
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
Алексей Морозов (Россия), Rambler.ru. ASP.NET в помощь хакеру и не только....
 

Semelhante a Сокеты

67
6767
67
JIuc
 
Алексей Лапаев - Протоколы межкомпонентного взаимодействия
Алексей Лапаев - Протоколы межкомпонентного взаимодействияАлексей Лапаев - Протоколы межкомпонентного взаимодействия
Алексей Лапаев - Протоколы межкомпонентного взаимодействия
Yandex
 
Операционные системы
Операционные системыОперационные системы
Операционные системы
yaevents
 
Java. Lecture 09. Network Programming
Java. Lecture 09. Network ProgrammingJava. Lecture 09. Network Programming
Java. Lecture 09. Network Programming
colriot
 
Практическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.ПочтеПрактическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.Почте
Alexey Androsov
 

Semelhante a Сокеты (20)

МАИ, Сети ЭВМ, Лекция №3
МАИ, Сети ЭВМ, Лекция №3МАИ, Сети ЭВМ, Лекция №3
МАИ, Сети ЭВМ, Лекция №3
 
Web лекция 1
Web   лекция 1Web   лекция 1
Web лекция 1
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Про асинхронное сетевое программирование
Про асинхронное сетевое программированиеПро асинхронное сетевое программирование
Про асинхронное сетевое программирование
 
67
6767
67
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
Node.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчикаNode.JS: возможности для РНР-разработчика
Node.JS: возможности для РНР-разработчика
 
Qlogic: Технологии Ethernet
Qlogic: Технологии EthernetQlogic: Технологии Ethernet
Qlogic: Технологии Ethernet
 
Обратная разработка бинарных форматов с помощью Kaitai Struct
Обратная разработка бинарных форматов с помощью Kaitai StructОбратная разработка бинарных форматов с помощью Kaitai Struct
Обратная разработка бинарных форматов с помощью Kaitai Struct
 
Алексей Лапаев - Протоколы межкомпонентного взаимодействия
Алексей Лапаев - Протоколы межкомпонентного взаимодействияАлексей Лапаев - Протоколы межкомпонентного взаимодействия
Алексей Лапаев - Протоколы межкомпонентного взаимодействия
 
Лекция 1. Модель OSI.
Лекция 1. Модель OSI.Лекция 1. Модель OSI.
Лекция 1. Модель OSI.
 
Cisco StealthWatch. Использование телеметрии для решения проблемы зашифрованн...
Cisco StealthWatch. Использование телеметрии для решения проблемы зашифрованн...Cisco StealthWatch. Использование телеметрии для решения проблемы зашифрованн...
Cisco StealthWatch. Использование телеметрии для решения проблемы зашифрованн...
 
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
DevConf2013: Особенности применения WebSocket на примере работы в ERP системе.
 
Операционные системы
Операционные системыОперационные системы
Операционные системы
 
Java. Lecture 09. Network Programming
Java. Lecture 09. Network ProgrammingJava. Lecture 09. Network Programming
Java. Lecture 09. Network Programming
 
МАИ, Сети ЭВМ, Лекция №2
МАИ, Сети ЭВМ, Лекция №2МАИ, Сети ЭВМ, Лекция №2
МАИ, Сети ЭВМ, Лекция №2
 
Практическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.ПочтеПрактическое применение HTML5 в Я.Почте
Практическое применение HTML5 в Я.Почте
 
C++ Базовый. Занятие 13.
C++ Базовый. Занятие 13.C++ Базовый. Занятие 13.
C++ Базовый. Занятие 13.
 

Сокеты

  • 3. Сокет Сокет — абстрактный объект, представляющий конечную точку соединения. В ОС объект сокета представлен файловым дескриптором и может принимать те же операции что и файл (открытие - чтение/запись - закрытие). Дополнительно сокеты имеют операции для связи их с адресом и подготовки к обмену данными. 3
  • 4. Типы • UNIX - для взаимодействия процессов на локальной машине. • INET - для взаимодействия по сети. • WebSocket - протокол напоминающий механизм сокетов, предназначен для связи браузера с сервером (в обе стороны). 4
  • 5. INET типы • Stream socket - TCP. • Datagram socket - UDP. • Raw socket - формируем пакеты вручную. 5
  • 6. Системный вызов socket Пример INET сокета типа TCP: Код 1: Си #include <sys/types.h> #include <sys/socket.h> int sock_fd = socket(AF_INET , SOCK_STREAM , 0); Код 2: Python import socket sock_obj = socket.socket(socket.AF_INET , socket.SOCK_STREAM , 0) 6
  • 7. Основные функции socket Создать новый сокет и вернуть файловый де- скриптор send Отправить данные по сети receive Получить данные из сети close Закрыть соединение bind Связать сокет с IP-адресом и портом listen Объявить о желании принимать соединения. Слушает порт и ждет когда будет установлено соединение accept Принять запрос на установку соединения connect Установить соединение 7
  • 8. Клиент. Установка соединения Со стороны клиента используется функция connect, которая инициирует установление связи на сокете: Код 3: Си #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd , const struct sockaddr *serv_addr , socklen_t addrlen ); Код 4: Python server_address = ('192.168.1.100 ', 8080) sock_obj.connect(server_address) 8
  • 9. Клиент. Установка соединения Со стороны клиента используется функция connect: Код 5: Си #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd , const struct sockaddr *serv_addr , socklen_t addrlen ); Код 6: Python server_address = ('192.168.1.100 ', 8080) sock_obj.connect(server_address) 9
  • 10. Сервер. Установка соединения Сервер слушает порт и при запросе от клиента устанавливает соединение. 10
  • 11. Сервер. Ждем соединения. Сервер слушает порт и ожидает запрос на соединение от клиента: Код 7: Си #include <sys/socket.h> int listen(int sockfd , int backlog ); Код 8: Python sock_obj.listen (5) # fd = 5 11
  • 12. Сервер. Подтверждаем соединение. accept - подтверждает запрос клиента и устанавливает соединение. Код 9: Си #include <sys/types.h> #include <sys/socket.h> int accept(int sockfd , struct sockaddr *cliaddr , socklen_t *addrlen ); Код 10: Python conn , addr = sock_obj.accept () 12
  • 13. Передача данных В Python вызов методов send, recv без дополнительных параметров, аналогичен системным вызовам read, write. Код 11: Си #include <sys/types.h> #include <unistd.h> ssize_t read(int fd, void *buf , size_t nbytes ); ssize_t write(int fd, const void *buf , size_t nbytes ); Код 12: Python conn.send('Hello␣World!') data = conn.recv(BUFFER_SIZE) 13
  • 14. Сервер TCP на Pyhton Создаем TCP сокет, который слушает порт 5005 на локальной машине. Код 13: Python import socket TCP_IP = '127.0.0.1 ' TCP_PORT = 5005 BUFFER_SIZE = 20 # Normally 1024, # but we want fast response s = socket.socket(socket.AF_INET , socket.SOCK_STREAM) s.bind((TCP_IP , TCP_PORT )) s.listen (1) 14
  • 15. Сервер TCP на Pyhton После запроса клиента и установки с ним соединения, сервер в бесконечном цикле принимает от него данные, выводит их на экран и возвращает обратно. (Эхо-сервер) Код 14: Python conn , addr = s.accept () print("Connection␣address:␣{}".format(addr)) while 1: data = conn.recv(BUFFER_SIZE) print("received␣data:␣{}".format(data)) conn.send(data) # echo conn.close() 15
  • 16. Клиент TCP TCP соединение всегда можно установить при помощи утилиты Telnet. Код 15: Telnet $ telnet localhost 5005 16
  • 17. Клиент TCP на Python Создаем сокет и отправляем запрос на установку соединения с сервером. Код 16: Python import socket TCP_IP = '127.0.0.1 ' TCP_PORT = 5005 BUFFER_SIZE = 1024 MESSAGE = "Hello ,␣World!" s = socket.socket(socket.AF_INET , socket.SOCK_STREAM) s.connect ((TCP_IP , TCP_PORT )) 17
  • 18. Клиент TCP на Python Отправляем данные, получаем ответ сервера и закрываем соединение. Код 17: Python s.send(MESSAGE) data = s.recv(BUFFER_SIZE) s.close() print("received␣data:␣{}".format(data)) 18
  • 19. Клиент HTTP на Python Устанавливаем TCP соединение с httpbin.org и отправляем строку запроса. Код 18: Python sock_obj = socket.socket(socket.AF_INET , socket.SOCK_STREAM) sock_obj.connect (('httpbin.org', 80)) sock_obj.send("GET␣/ip␣HTTP /1.0nn") 19