Sockets TCP, Linux, C: Ejemplo servidor secuencial . Breve teoría.
Sintesi
TLDREste extenso vídeo tutorial ofrece una guía paso a paso sobre la construcción de un servidor TCP secuencial utilizando sockets en el lenguaje C, ejecutándose en un sistema Linux. Se cubren aspectos teóricos y prácticos: los sockets TCP como mecanismo de comunicación entre procesos, las diferencias entre sockets stream y datagram, y el uso del protocolo TCP para garantizar la entrega de datos. La implementación se realiza con hardcoding de direcciones IP usando un entorno virtualizado, con herramientas como Wireshark para monitorear la red, y uso de llamadas al sistema como socket(), bind(), listen(), y accept() para configurar y manejar conexiones. Ideal para desarrolladores que buscan profundizar en la programación de redes en C.
Punti di forza
- 📡 Vantagens dos sockets TCP: garantem a entrega de dados e são orientados à conexão.
- 🔠 Diferentes tipos de sockets: stream, datagram e raw, cada um com funcionalidades específicas.
- 🌐 Sockets TCP se comunicam entre máquinas diferentes na Internet.
- 💻 Implementação prática do servidor TCP em C no Linux.
- 🏁 Hardcoding de parâmetros de servidor pode ser substituído por configurações dinâmicas.
- 📦 Uso de ferramentas como Wireshark para monitorar o tráfego de rede.
- 🏗 Importância das chamadas de sistema: criar socket, bind, listen, accept, connect.
- 🛑 Implementação de backlogs para filas de clientes no servidor.
- 📥 Uso de buffers para transmissão e recepção de dados entre cliente e servidor.
- 🔄 Procedimento para teste e depuração do código usando máquina virtual.
Linea temporale
- 00:00:00 - 00:05:00
O vídeo fala sobre a construção de um servidor TCP sequencial, que atende clientes um de cada vez. Ele começará com uma introdução teórica sobre o que é um socket, TCP e o design do servidor, seguido pela construção do código desse servidor em C no Linux, usando IP versão 4.
- 00:05:00 - 00:10:00
Os sockets permitem a troca de dados entre processos em máquinas diferentes, como em um domínio Unix para processos na mesma máquina, ou domínio da internet para processos em máquinas separadas. No TCP, garante-se que os dados não se percam, diferentemente dos sockets de datagrama onde isso não é garantido.
- 00:10:00 - 00:15:00
Explica-se como o servidor utiliza um socket passivo para ouvir conexões, enquanto o cliente usa um socket ativo para conectar-se ao servidor. O processo do cliente envolve a criação do socket e a tentativa de se conectar ao servidor, e encerra a conexão com a chamada do sistema close.
- 00:15:00 - 00:20:00
O trecho detalha a implementação do servidor TCP sequencial incluindo a criação do socket, atribuição de IP e porta, estabelecimento do socket passivo com listen, e seu bloqueio com accept para esperar conexões. Quando uma conexão é aceita, permite-se operações de leitura e escrita entre cliente e servidor.
- 00:20:00 - 00:25:00
A parte explica a implementação do cliente em C, que se conecta ao servidor, envia uma mensagem e aguarda uma resposta. O cliente utiliza a chamada de sistema connect e troca dados com read/write antes de fechar o socket. Em caso de erro, ele terminará o programa após exibir a falha.
- 00:25:00 - 00:30:00
Descreve-se a configuração do ambiente de teste, incluindo instalação de Ubuntu em uma virtual box, definição de IP estático e rede bridge para comunicação direta. Inclui explicações sobre o código servidor em C e suas estruturas usadas para definir parâmetros, endereço IP e número de porta.
- 00:30:00 - 00:38:12
A demonstração inclui o uso do Wireshark para monitorar tráfego entre servidor e cliente, filtrando pacotes por IP fonte e destino. Após execução, visualizam-se pacotes enviados e recebidos, mostrando a comunicação texto entre cliente e servidor. Código será disponibilizado no GitHub para referência.
Mappa mentale
Video Domande e Risposte
O que é um servidor TCP sequencial?
É um servidor que atende um cliente por vez, aguardando a conclusão de cada um para atender o próximo.
Quais são os tipos de sockets mencionados no vídeo?
Tipos de sockets incluem stream (TCP), datagram (UDP) e raw (para protocolos personalizados).
Por que o tutorial utiliza C e Linux para implementação?
C é uma linguagem de baixo nível com controle direto sobre as chamadas de sistema, e o Linux oferece um sistema robusto para programação de sockets.
Qual ferramenta foi mencionada para monitorar o tráfego de rede?
Wireshark foi a ferramenta mencionada para fazer sniffing do tráfego de rede.
Como é garantida a entrega de dados nos sockets TCP?
A entrega de dados é garantida através do protocolo TCP, que é orientado à conexão e assegura que os dados sejam recebidos na ordem correta.
Visualizza altre sintesi video
CAVERNA DO DRAGÃO: O EPISÓDIO PERDIDO
QUINCAS BORBA - Profa. Dra em Literatura pela USP, MIRIAM BEVILACQUA
Cuidar emprendedores | Rodrigo Silva | TEDxVitacura
Filosofia 1º ano - Capítulo 5 - O Ser Humano como ser racional - Prof Lenon
Ser humano...ser várias facetas - Vd.3 1ºano Cp.6
Do no Harm a Dateline Special
- 00:00:00este vídeo tratará sobre sockets tcp y
- 00:00:03en concreto se va a ver cómo se
- 00:00:05construye un servidor tcp secuencial con
- 00:00:09esto de secuencial se quiere decir que
- 00:00:12el servidor atiende en primer lugar a un
- 00:00:14cliente y una vez ha terminado con este
- 00:00:17entonces atiende al siguiente cliente
- 00:00:20en el vídeo se va a ver por un lado una
- 00:00:23breve introducción teórica de que es un
- 00:00:25socket que es tcp diseño de servidor que
- 00:00:29hay y en segundo lugar se verá cómo se
- 00:00:33construye el código para este servidor
- 00:00:35de cepes secuencial y se hará en ce bajo
- 00:00:39linux y para la dirección para la
- 00:00:43versión 4 de la dirección ip
- 00:00:47los sockets son un mecanismo de
- 00:00:50comunicación entre procesos es decir los
- 00:00:53sockets permiten que los procesos
- 00:00:56intercambien datos entre ellos otro
- 00:01:00ejemplo de mecanismo de comunicación
- 00:01:01podría ser una cola de mensajes un
- 00:01:03message o un pipe una tubería
- 00:01:08en el caso de los sockets tcp las
- 00:01:11aplicaciones que intercambian datos
- 00:01:13están en dos máquinas diferentes
- 00:01:16separadas por la red por internet
- 00:01:18entonces desde el punto de vista de
- 00:01:21dónde están esos procesos que
- 00:01:23intercambian datos se definen dos
- 00:01:26dominios se llaman dominios de perdón de
- 00:01:29comunicación por un lado está el dominio
- 00:01:31unics en el cual las aplicaciones están
- 00:01:34corriendo dentro de la misma máquina y
- 00:01:36está el dominio de internet donde las
- 00:01:40aplicaciones que se están intercambiando
- 00:01:42datos corren en máquinas que están
- 00:01:45conectadas a través de la red en el caso
- 00:01:47de sockets tcp
- 00:01:51este es el dominio en el que están
- 00:01:54nuestras máquinas en el internet en
- 00:01:57función de cómo se realice la entrega de
- 00:01:59datos podemos definir varios tipos de
- 00:02:01sockets en primer lugar en los streams
- 00:02:04sockets y con esto de stream se quiere
- 00:02:07decir flujo o corriente de datos en
- 00:02:10segundo lugar estaría los data ground
- 00:02:13sockets los data gramas y en tercer
- 00:02:15lugar y no lo escrito aquí estarían los
- 00:02:18rockets o sockets crudos para definir tu
- 00:02:20propio protocolo de transporte en primer
- 00:02:23lugar los streams la recepción de los
- 00:02:27datos está aquí garantizada no se
- 00:02:30pierden pero no hay concepto de mensaje
- 00:02:34y con esto para entenderlo se puede
- 00:02:37comparar con un pipe en un país un
- 00:02:40proceso va escribiendo bytes no mensajes
- 00:02:42sino va escribiendo bytes y conforme lo
- 00:02:44va haciendo el proceso que va leyendo de
- 00:02:46ese país pues va leyendo esos bytes pero
- 00:02:50no hay una frontera entre el mensaje 1
- 00:02:52entre el mensaje 2
- 00:02:54también
- 00:02:56se definen como orientados a conexión y
- 00:02:59en el caso de que estemos en el dominio
- 00:03:01de internet es decir en el caso de que
- 00:03:04las aplicaciones que están utilizando
- 00:03:06sockets para comunicarse estén en
- 00:03:08máquinas separadas conectadas por
- 00:03:11internet los vamos a llamar sockets tcp
- 00:03:15aquí te
- 00:03:16c
- 00:03:19en el caso de los data gr más así que
- 00:03:23hay concepto de mensaje y estos mensajes
- 00:03:25se llaman data gramas
- 00:03:28la transmisión de datos en este caso no
- 00:03:30está garantizada pueden llegar pueden no
- 00:03:33llegar pueden llegar duplicados y si
- 00:03:36estamos en el dominio de internet los
- 00:03:38vamos a llamar vp
- 00:03:42bien
- 00:03:44bueno el ejemplo que veremos
- 00:03:47será sobre sockets tcp en este caso el
- 00:03:51tercer caso que he comentado se escribe
- 00:03:53así r o w
- 00:03:56nada que ver con este sería el tercer
- 00:03:58caso que son los sockets crudos
- 00:04:04bueno volviendo al título principal del
- 00:04:06vídeo sockets tcp por socket vamos
- 00:04:08entender mecanismo de comunicación y
- 00:04:11cuando se habla de tcp vamos a entender
- 00:04:13que las aplicaciones que se están
- 00:04:15intercambiando datos corren en máquinas
- 00:04:18diferentes que están conectadas por la
- 00:04:20red y utilizan como protocolo tcp bien
- 00:04:25por esto por usar tcp la entrega de
- 00:04:29datos va a estar garantizada
- 00:04:32en función de cómo se comporte el socket
- 00:04:35a la hora de
- 00:04:37y establecer una conexión se definirá
- 00:04:39como pasivo o activo
- 00:04:43en el caso de un servidor se utilizará
- 00:04:46un socket pasivo que estará escuchando y
- 00:04:49manteniéndose a la espera de que un
- 00:04:52socket activo un cliente trate de
- 00:04:54conectarse a él
- 00:04:56el cliente utilizará un socket activo
- 00:05:00que tratará activamente de conectarse a
- 00:05:03un servidor
- 00:05:08para implementar tanto el servidor como
- 00:05:10el cliente debemos utilizar una serie de
- 00:05:13llamadas al sistema para poder trabajar
- 00:05:15con los sockets en el caso del servidor
- 00:05:19en primer lugar vamos a crear el socket
- 00:05:23y con ello para ello se usa la llamada
- 00:05:27al sistema socket está llamada el
- 00:05:30sistema tiene una serie de argumentos de
- 00:05:31entrada que luego vamos a ver
- 00:05:36una vez creado ese socket se le asigna
- 00:05:39una dirección ip y un número de puerto
- 00:05:43esto se hace con la llamada al sistema
- 00:05:4620
- 00:05:48después vamos a marcar es eso que está
- 00:05:51creado que ya tiene ip y número de
- 00:05:53puerto asociado como socket pasivo y
- 00:05:57para ello se usa la llamada al sistema
- 00:05:59listen también tiene argumentos de
- 00:06:02entrada que luego los vemos bien
- 00:06:07con la llamada al sistema accept aceptar
- 00:06:10el él
- 00:06:16el servidor va a estar esperando aquí
- 00:06:19hasta que un cliente trate de conectarse
- 00:06:25esto es por el lado del servidor
- 00:06:27entonces por el lado de del cliente el
- 00:06:31proceso cliente
- 00:06:33tiene que crear primero el socket
- 00:06:35también con la llamada al sistema
- 00:06:36sockets con sus argumentos
- 00:06:39una vez creado vamos a llamar a connect
- 00:06:44para que conecte eso para que trate de
- 00:06:47conectar ese socket creado a una
- 00:06:49dirección ip en concreto que será la
- 00:06:53dirección ip del servidor bien cuando el
- 00:06:56servidor vea
- 00:06:58que hay una petición entrante de
- 00:07:02conexión de un cliente si puede es decir
- 00:07:06si no está ahora mismo teniendo otro
- 00:07:08cliente porque el servidor que vamos a
- 00:07:11diseñar es secuencial primero un cliente
- 00:07:13el otro cliente bueno en caso de que
- 00:07:15pueda aceptar esa petición
- 00:07:19y llamar al sistema accept del servidor
- 00:07:22se desbloqueará y nos va a devolver un
- 00:07:24file de escritor un descriptor de
- 00:07:27archivo con el que podremos realizar
- 00:07:30operaciones de escritura y lectura es
- 00:07:33decir
- 00:07:35el cliente y el servidor podrán
- 00:07:38intercambiarse ya los datos por la parte
- 00:07:40del proceso cliente también usaría ready
- 00:07:43right para escribir y leer datos lo que
- 00:07:45sea necesario una vez se haya terminado
- 00:07:49de este intercambio de datos cerraremos
- 00:07:53los descriptores de archivo
- 00:07:56correspondientes con la llamada al
- 00:07:57sistema close por la parte del servidor
- 00:07:59y por la parte del cliente bueno antes
- 00:08:02de pasar a ver directamente el código
- 00:08:04fuente veamos una idea general de lo que
- 00:08:07se quiere hacer aquí vamos a construir
- 00:08:10un programa servidor y lo vamos a
- 00:08:13instalar en esta máquina
- 00:08:15en este computador tengo windows
- 00:08:18instalado de manera nativa en la versión
- 00:08:2010 y sobre el mismo una máquina virtual
- 00:08:22virtual box que tiene a su vez instalado
- 00:08:26ubuntu vale además voy a utilizar el
- 00:08:29programa white hart que está instalado
- 00:08:31en windows para que veamos el tráfico de
- 00:08:33red para hacer sniffing bien el programa
- 00:08:37servidor correrá aquí sobre ubuntu y en
- 00:08:42esta máquina y definida una ip estática
- 00:08:45que es ésta vale es decir para que el
- 00:08:48cliente se conecta al servidor tendrá
- 00:08:51que llamar a ésta tendrá que conectarse
- 00:08:53a esta ip y el puerto que utilice el
- 00:08:57servidor es el 8 1080 vale por otro lado
- 00:09:00y para testear que el servidor realmente
- 00:09:03funciona vamos a construir un cliente de
- 00:09:05prueba por lo tanto el servidor
- 00:09:06comerciantes son de prueba porque hacen
- 00:09:08cosas muy sencillas bien entonces para
- 00:09:10el cliente voy a utilizar una
- 00:09:12computadora en la que tenía instalado
- 00:09:13ubuntu una versión bastante antigua pero
- 00:09:15todavía funciona bastante bien y aquí
- 00:09:18están a mi cliente de test y este bueno
- 00:09:21pues tiene la una ip dinámica que es
- 00:09:25asignada por el router bien es el mis
- 00:09:27router wi-fi y éste es mi red de área
- 00:09:30local
- 00:09:32es decir las dos máquinas esta y estas
- 00:09:35se encuentran en esta red bueno tengo
- 00:09:38aquí el código de
- 00:09:42del servidor secuencial en c
- 00:09:46respecto a los incluidos que necesitamos
- 00:09:49el de los símbolos standard
- 00:09:53esto sin clubes para los sockets y estos
- 00:09:57porque voy a realizar printemps para que
- 00:10:00en la consola se nos indique tanto que
- 00:10:02ha habido éxito que algo funciona como
- 00:10:04para indicar errores que incluyes
- 00:10:08necesitamos
- 00:10:10en esto nos puede ayudar la página del
- 00:10:14manual de linux por ejemplo si voy a
- 00:10:17utilizar la llamada al sistema socket
- 00:10:20busco aquí en este campo de búsqueda
- 00:10:25me dirán necesitas éstos incluyen
- 00:10:28entonces voy y los copio así con todo si
- 00:10:32no pongo los suficientes no compilará ya
- 00:10:34está
- 00:10:36bueno el siguiente paso es definir de
- 00:10:40alguna manera los parámetros del
- 00:10:41servidor yo lo he hecho de manera
- 00:10:43llamada hard code y jordi es decir los
- 00:10:46codificados de manera que son constantes
- 00:10:50no se pueden modificar hay otras maneras
- 00:10:53de hacerlo también he elegido el puerto
- 00:10:56del servidor el 8080 no para más
- 00:11:01información
- 00:11:03la wikipedia por ejemplo el puerto 8080
- 00:11:07se conoce por ser un alternativo para
- 00:11:10usar el http vale y hay otras
- 00:11:14aplicaciones que también lo usan yo
- 00:11:18simplemente lo he utilizado para mi
- 00:11:20servidor de prueba lo siguiente hay que
- 00:11:23definir la dirección ip de mi servidor
- 00:11:29entonces yo he elegido esta que es la he
- 00:11:31configurado de manera estática en mi
- 00:11:33máquina como he dicho antes este
- 00:11:35servidor va a funcionar va a dar soporte
- 00:11:37solamente a la versión 4 de la ip ipv4
- 00:11:42para ipv6 habría que realizar
- 00:11:44modificaciones aquí
- 00:11:46respecto a esta ip bien si estás en
- 00:11:48ubuntu como yo y estás en una máquina
- 00:11:51virtual también bien estoy utilizando
- 00:11:53esta conexión de aquí la n 0 s 9 le doy
- 00:11:58a settings
- 00:12:00ipv4 y la he configurado de manera
- 00:12:03manual para que no para que no cambie
- 00:12:06así el cliente sabe a quien tiene que
- 00:12:09conectarse bueno aquí está y aquí está
- 00:12:12la máscara de red correspondiente que
- 00:12:15también es pues la máscara de mi red
- 00:12:18bien estoy en una máquina virtual
- 00:12:21entonces
- 00:12:24voy a ir a los settings
- 00:12:26aquí en los settings de vm virtualbox me
- 00:12:31voy
- 00:12:33settings network y el adaptador 3 el 1 y
- 00:12:37el 2 los he definido para otras cosas y
- 00:12:40el 3 es el que voy a utilizar ahora es
- 00:12:42de tipo bridge adapter
- 00:12:45es decir que voy de alguna manera a
- 00:12:47puentear la tarjeta de red y voy a
- 00:12:51enviar y recibir datos directamente a
- 00:12:53través de ella
- 00:12:54defino el tamaño de búfer 100 el tamaño
- 00:12:58de búfer para la red para leer datos
- 00:12:59como para enviar datos y el backlog
- 00:13:03luego veremos un poco mejor en qué
- 00:13:05llamada sistema se utiliza le doy el
- 00:13:07valor a 5 el backlog es el número máximo
- 00:13:10de clientes que pueden estar esperando a
- 00:13:13conectarse al servidor como es
- 00:13:16secuencial solo sirve un cliente está
- 00:13:19atendido y cuando éste termine de ser
- 00:13:21atendido
- 00:13:22el cliente que esté esperando en la cola
- 00:13:25siguiente será atendido en ese momento
- 00:13:28con un número máximo de clientes que
- 00:13:29pueden esperar
- 00:13:30ese es el backlog bien ahora paso a
- 00:13:33definir el main ahora mismo estos
- 00:13:35argumentos de entrada no los voy a
- 00:13:37utilizar
- 00:13:39podría por ejemplo definir como
- 00:13:40argumento de entrada el número de
- 00:13:42puertos en lugar de hacer un hard coding
- 00:13:45y meterlo como parámetro ahora cuando
- 00:13:50ejecuta el programa parámetro de entrada
- 00:13:52quiero decir vale defino dos variables
- 00:13:55de tipo entero que van a ser los
- 00:13:57descriptores del archivo uno va a ser el
- 00:14:01escritor de archivo del socket
- 00:14:05que está escuchando para recibir
- 00:14:07conexiones de clientes y otro descriptor
- 00:14:12de archivo que va a ser de ese socket
- 00:14:13que se crea cuando un cliente ya se
- 00:14:17conecta con ese país descriptor podremos
- 00:14:20leer y escribir datos al cliente bueno
- 00:14:25una variable de tipo un sign de entero
- 00:14:28sin signo llamada ley que va a ser la
- 00:14:31longitud de la dirección del cliente
- 00:14:34bien y 2
- 00:14:39dos variables de este tipo es una
- 00:14:41estructura llamadas así de esta manera
- 00:14:43una para el servidor y otra por el
- 00:14:46cliente ahora vemos que es la copio i
- 00:14:51lo meto en el manual de linux
- 00:14:56y busco en esta estructura se nos define
- 00:15:00el formato de la dirección es una
- 00:15:04estructura que contiene varios campos y
- 00:15:06en el que definimos de qué familia es
- 00:15:09ese socket es a efe y net se definan si
- 00:15:13es un tcp socket es un tcp implica
- 00:15:15internet y lo definimos así luego otro
- 00:15:19campo que define el puerto y otro que
- 00:15:22define la dirección este formato es para
- 00:15:25ip address es para direcciones ip
- 00:15:28versión 4 para versión 6 utilizaríamos
- 00:15:31otra cosa
- 00:15:33bien para el servidor y para el cliente
- 00:15:37bueno necesito dos variables de tipo
- 00:15:39entero una para la longitud recibida y
- 00:15:42otra para longitud transmitida das
- 00:15:44inicial hizo con el valor cero y ahora
- 00:15:47dos woofers uno para transmisión y otro
- 00:15:50para recepción el de transmisión es
- 00:15:52decir los datos que el servidor envía al
- 00:15:55cliente
- 00:15:55bueno pues les voy a definir este este
- 00:15:59string que sí que diga hola cliente soy
- 00:16:01el servidor este es el mensaje o los
- 00:16:03datos que el servidor va a transmitir al
- 00:16:05cliente y en recepción en este búfer se
- 00:16:10cargarán los los bytes que yo leo que me
- 00:16:13está enviando el cliente bueno en primer
- 00:16:16lugar
- 00:16:18y si volvemos a
- 00:16:21al diagrama del principio el servidor
- 00:16:25tiene que crear un socket y lo hace con
- 00:16:27esta llamada al sistema socket bien
- 00:16:30vuelve a la máquina virtual
- 00:16:32ok esta es la llamada al sistema el
- 00:16:36primer argumento
- 00:16:39es el dominio es internet es un socket
- 00:16:44tcp el segundo argumento es el tipo de
- 00:16:50socket
- 00:16:51recordemos que teníamos los streams
- 00:16:53sockets y los data gran sockets y el tcp
- 00:16:56corresponde a socket stream y el tercero
- 00:16:58argumento tiene que ver con el protocolo
- 00:17:00especificado aquí vamos a usar tcp y
- 00:17:02pongo un cero no sea quiero decir con él
- 00:17:06con el socket de tipo tcp se utiliza el
- 00:17:09protocolo tcp entonces aquí no
- 00:17:11especificamos nada
- 00:17:13bien entonces esto nos va a crear un
- 00:17:17zoquete el primer socket y nos devuelve
- 00:17:18este file d escriptors si ha habido un
- 00:17:20error en la llamada al sistema de volver
- 00:17:22a -1 no sé
- 00:17:25imprimirá cuál es el error y nos
- 00:17:28devuelve un -1 el corto a la línea al
- 00:17:31final voy a dejar todo el código en
- 00:17:33github y abajo en la dirección
- 00:17:36la url
- 00:17:38bueno y si ha habido éxitos y esteso que
- 00:17:41de fede tiene un valor válido entonces
- 00:17:43nos dirá el socket se ha creado con
- 00:17:45éxito bueno en siguiente en siguiente
- 00:17:47lugar vamos a crear esa estructura ese
- 00:17:50address format que hemos visto y lo
- 00:17:53vamos a inicializar con ceros para eso
- 00:17:55utilizo mem set que inicializa con ceros
- 00:17:58pues cada uno de los bytes de esta
- 00:18:01estructura del the address format para
- 00:18:04el servidor 1 está inicializa a todo
- 00:18:07clear vamos a asignarle vamos a definir
- 00:18:10sus campos la familia
- 00:18:13del sockets dominio internet o sea sera
- 00:18:16efe
- 00:18:21la dirección y p
- 00:18:24es esa que hemos definido arriba 192
- 00:18:28puntos 68 puntos 0.1
- 00:18:34convierte este string porque estos son
- 00:18:38string
- 00:18:40en el formato
- 00:18:44necesario
- 00:18:47y por último el campo del puerto del
- 00:18:49servidor que es este que hemos definido
- 00:18:51de manera constante y utilizo la función
- 00:18:55h tns que lo que hace es convertir este
- 00:19:02valor en él
- 00:19:04o sea que lo que hace es que esté este
- 00:19:07valor tenga la ordenación de bytes que
- 00:19:09debe tener en la red
- 00:19:11es decir la ordenación de cómo se
- 00:19:14guardan los bytes en memoria depende de
- 00:19:15la arquitectura de cada computador y
- 00:19:19y hay que enviarlos en una en un formato
- 00:19:23determinado por la red para que máquinas
- 00:19:25de arquitecturas diferentes se
- 00:19:26comprendan de ahí que utilizamos esta
- 00:19:29función h toms bien ya tenemos nuestra
- 00:19:32estructura con los campos con los
- 00:19:34valores de configuración de nuestros
- 00:19:37servidores cargados y ahora y ahora lo
- 00:19:40que vamos a hacer es asignar el el
- 00:19:43sockets a
- 00:19:47una dirección ip y un puerto es el
- 00:19:51número de puertos le llaman al sistema
- 00:19:5320
- 00:19:55el primer argumento el file descriptor
- 00:19:57de socket que es el que nos ha devuelto
- 00:19:59la llamada sistema socket que es la que
- 00:20:02ha creado el socket el siguiente
- 00:20:05argumento es un puntero a esta
- 00:20:09estructura que hemos definido con los
- 00:20:11campos del servidor y el último
- 00:20:13argumento es el tamaño en bytes de esa
- 00:20:16estructura
- 00:20:17entonces si 20 nos devuelve un número
- 00:20:20mayor a 0 significa que hemos podido
- 00:20:22asociar asignar a ese socket una
- 00:20:25dirección ip y un puerto si hay un error
- 00:20:29bueno nos indicará en pantalla cuál es
- 00:20:32el error y si todo va bien nos dirá
- 00:20:35tuviste éxito
- 00:20:38ahora vamos con la llamada al sistema
- 00:20:39listen que es la que hace que es eso que
- 00:20:43hemos creado al principio se vuelva
- 00:20:45pasivo pasivo que es decir que esté
- 00:20:48escuchando pendiente de si hay
- 00:20:49peticiones entrantes de clientes que
- 00:20:51quieren conectarse a nuestro servidor el
- 00:20:53primer argumento el file de escritor del
- 00:20:55socket y segundo el el backlog que es el
- 00:20:57número máximo de conexiones pendientes
- 00:21:00que puede haber haciendo cola esperando
- 00:21:02que las atendamos buenos y listen
- 00:21:05devuelve un valor diferente de 0 imprime
- 00:21:08un error en pantalla y si no hemos
- 00:21:11tenido éxito
- 00:21:13bueno antes de entrar a el look que nos
- 00:21:15va a ir aceptando los clientes
- 00:21:16sucesivamente
- 00:21:19cargo en esta variable el en el tamaño
- 00:21:22en bytes de esa estructura para el agro
- 00:21:26es formato del del cliente esto
- 00:21:28simplemente el tamaño vale entonces wild
- 00:21:31truck mientras para siempre va aceptando
- 00:21:34data de los sockets que va entrando y
- 00:21:37vamos a ver el diagrama otra vez
- 00:21:40hoy
- 00:21:42aquí
- 00:21:44vale ahora estamos aquí hemos hecho
- 00:21:46hemos creado el socket lo hemos asignado
- 00:21:48una ip hemos marcado como pasivo y ahora
- 00:21:51vamos a quedarnos en accept esta llamada
- 00:21:54al sistema va a permitir que los
- 00:21:56clientes se conecte un cliente se
- 00:21:58conecte y va a bloquear se va a esperar
- 00:22:00ahí hasta que pues es un cliente tarde
- 00:22:02trate de conectarse bien y cuando ese
- 00:22:05cliente se conecte se creará un nuevo
- 00:22:07socket ya bueno esta es la llamada al
- 00:22:10sistema accept a la que le metemos
- 00:22:12primer argumento el descriptor de
- 00:22:14archivo de ese socket pasivo segundo
- 00:22:17argumento es un puntero a esas
- 00:22:20estructuras o padres que hemos declarado
- 00:22:24al principio para el cliente y entonces
- 00:22:27cuando la función cuando la llama del
- 00:22:29sistema accept retorne en esta
- 00:22:33estructura se nos cargarán los valores
- 00:22:35de dirección ip puerto y dominio del
- 00:22:39cliente que se ha conectado vale y por
- 00:22:42último un puntero la variable leen que
- 00:22:45aquí la habíamos inicial izado con el
- 00:22:48tamaño
- 00:22:49esa estructura son padres para el
- 00:22:52cliente y bueno es un argumento de
- 00:22:54entrada/salida que a la entrada le damos
- 00:22:56que ese valor cuando llamamos accept y
- 00:22:58cuando accept retorne aquí se nos
- 00:23:00devolverá el tamaño de la dirección del
- 00:23:03socket cliente
- 00:23:06bien acepta
- 00:23:10se bloqueará aquí el programa y nos
- 00:23:12devolverá un file descriptor
- 00:23:17de un nuevo socket ese socket que
- 00:23:20permite la conexión al al cliente y que
- 00:23:23a través de ese file descriptor
- 00:23:24escribiremos y leeremos ya datos al
- 00:23:26entonces y ese fue el descriptor es
- 00:23:28válido bueno si es menor que cero si es
- 00:23:31inválido imprimes un error en pantalla y
- 00:23:34terminas
- 00:23:38y si es válido en un bucle vamos a leer
- 00:23:42datos del cliente hasta que este cierre
- 00:23:44entonces lo primero que va a hacer el
- 00:23:46servidor es leer si hay datos del
- 00:23:50cliente vale para eso utilizo en la
- 00:23:53función red y el primer argumento de red
- 00:23:55será este file descriptor de este
- 00:23:59de este shock que acabamos de crear con
- 00:24:01el haccp el segundo el buffer de
- 00:24:04recepción donde se van a cargar los
- 00:24:06datos leídos y el tercero bueno el
- 00:24:08tamaño de este buffer para que como
- 00:24:11máximo se serían esos datos
- 00:24:14si la longitud recibida es menos 1 ha
- 00:24:16habido un error imprime los y la
- 00:24:18longitud recibida es igual a 0 esto
- 00:24:21significa que el socket cliente ha
- 00:24:24cerrado entonces diremos el cliente es
- 00:24:27el socket cliente a cerrar o cerrado y
- 00:24:30el servidor debe cerrar ese file
- 00:24:33descriptor correspondiente a ese socket
- 00:24:36que estaba conectado con el cliente
- 00:24:38y ya saldríamos de este bucle con este
- 00:24:41break y si red devuelve un valor mayor
- 00:24:45que 0 entonces ahí estamos
- 00:24:48comunicándonos eso significa que hemos
- 00:24:51leído algo y que lo vamos a imprimir
- 00:24:54aquí el buffer de recepción y además le
- 00:24:57vamos a enviar algo con raid
- 00:25:00paraguay primer argumento el file
- 00:25:01descriptor de esa conexión el segundo el
- 00:25:05buffer de transmisión que dice algo así
- 00:25:07como hola cliente soy el servidor y el
- 00:25:09tercero es el tamaño de esos datos que
- 00:25:12vamos a enviar entonces estaríamos en
- 00:25:15este while true mientras el cliente pues
- 00:25:19siga queriendo enviar y recibir datos
- 00:25:21cuando el cliente cierre la conexión
- 00:25:25este rey recibirá un 0 y el servidor
- 00:25:30también cerrará la conexión y en ese
- 00:25:33momento
- 00:25:34volveremos a ver si se ve
- 00:25:39en ese momento aquí estamos leyendo y
- 00:25:42escribiendo
- 00:25:43a un cliente y cuando el cliente cierre
- 00:25:47el servidor cierra ese file descriptor y
- 00:25:50tenemos aquí este bucle entonces aquí
- 00:25:54estoy haciendo
- 00:25:55entonces aceptaremos si es que
- 00:25:58volveremos a la llamada al sistema
- 00:26:00accept que si hay un cliente que está
- 00:26:03esperando en cola ya para ser atendido
- 00:26:04pues se creará un nuevo socket para
- 00:26:07conectarse a ese cliente y si no pues
- 00:26:11puedes esperar a bloquear aquí el
- 00:26:13programa hasta aquí a un cliente que
- 00:26:14quiera quieras saber algo del servidor
- 00:26:16bueno y así sucesivamente cliente a
- 00:26:19cliente
- 00:26:20lo teníais aquí
- 00:26:24etc el nombre de este archivo que es
- 00:26:26server secuencial ce y el nombre del
- 00:26:29ejecutable - hoy el nombre de ejecutable
- 00:26:31que quiero darle y ese vale
- 00:26:36server voy a ejecutar este programa el
- 00:26:39programa servidor entonces el socket ha
- 00:26:42sido creado es eso que va a escuchar el
- 00:26:46socket ha sido 20 combined lo asocia
- 00:26:50vamos a la dirección ip y al puerto y al
- 00:26:54puerto 8080 y ahora el socket se han
- 00:26:58marcado como pasivo y este mensaje nos
- 00:27:01acabe esa instrucción
- 00:27:03dice estoy escuchando en el puerto 8 mil
- 00:27:0680 vale aquí el programa está bloqueado
- 00:27:10en este accept que hemos visto esperando
- 00:27:13que un cliente trate de conectarse
- 00:27:17bueno ahora vamos a ver brevemente el
- 00:27:19código del cliente si volvemos al
- 00:27:21diagrama rápidamente el cliente lo que
- 00:27:24tiene que hacer es crear un socket con
- 00:27:26esta llamada al sistema y con la llamada
- 00:27:28al sistema connect tratará de conectar
- 00:27:30ese socket a una dirección ip es decir
- 00:27:33la dirección ip del servidor una vez
- 00:27:35conectado con red y raid realizaremos
- 00:27:38ese intercambio de datos con el servidor
- 00:27:40y cuando termines con el close cierras
- 00:27:44ese descriptor de archivo y cierras esa
- 00:27:46conexión entonces el servidor se da
- 00:27:48cuenta de que el cliente ha cerrado y
- 00:27:51puede atender a un siguiente cliente
- 00:27:54bueno ahora vamos con el código del
- 00:27:56cliente brevemente
- 00:27:59aunque luego hay que compilar lo y
- 00:28:01ejecutarlo en otra máquina bueno yo lo
- 00:28:03voy a hacer así una para el servidor
- 00:28:05otra para el cliente y estarán
- 00:28:06conectadas por una red de área local
- 00:28:10en este cliente lo que va a hacer es se
- 00:28:12conecta al servidor del socket al socket
- 00:28:15del servidor le va a enviar un texto
- 00:28:18predefinido lee lo que el servidor le
- 00:28:21responde y desconecta cierra la conexión
- 00:28:24bueno incluso es necesario se puede leer
- 00:28:27en el manual
- 00:28:29ahora vamos a definir
- 00:28:31cuál es la ip de la de la y en la
- 00:28:35dirección ip del servidor al que nos
- 00:28:36vamos a conectar y el puerto de fino 2
- 00:28:39buffer uno el de transmisión los datos
- 00:28:42que el cliente envía el servidor algo
- 00:28:44tan simple con un texto que diga hola
- 00:28:46servidor soy un cliente y un búfer para
- 00:28:50que podamos leer esos datos que vienen
- 00:28:53del servidor el tamaño va a ser 100 es
- 00:28:56decir una operación de lectura podemos
- 00:28:58cargar en ese arroyo máximo 100 bytes
- 00:29:02vamos con el programa principal sin
- 00:29:05argumentos de entrada defino un
- 00:29:08descriptor para un descriptor de archivo
- 00:29:11un file descriptor para el socket que va
- 00:29:14a utilizar el cliente bien y ahora una
- 00:29:17estructura de este tipo como hemos visto
- 00:29:19antes en el servidor
- 00:29:20el programa servidor esta estructura
- 00:29:23será para
- 00:29:25para la dirección del servidor su puerto
- 00:29:29y su dominio cada uno de sus campos bien
- 00:29:32creamos el socket con la llamada al
- 00:29:35sistema socket igual que antes primer
- 00:29:37argumento dominio segundo el tipo de
- 00:29:39socket y tercero un cero porque vamos a
- 00:29:42utilizar aquí el protocolo tcp nada
- 00:29:44diferente si está llamando al sistema
- 00:29:46nos devuelve un -1 esto significa error
- 00:29:49es eso que no se ha creado imprimo en la
- 00:29:51consola un mensajito de error y terminó
- 00:29:54el programa si ese descriptor de archivo
- 00:29:57tiene un valor válido estaremos acá
- 00:29:59vemos en este el pse y decimos en
- 00:30:01pantalla el socket ha sido creado
- 00:30:04satisfactoriamente bien ahora
- 00:30:08esta estructura con esos campos para el
- 00:30:12servidor la vamos a inicializar con todo
- 00:30:14ceros en dos utiliza la función mmmm set
- 00:30:17y voy a poner un cero en cada uno de los
- 00:30:20bytes de esta estructura un clear bien
- 00:30:26ahora una vez lo tengo todo a cero en el
- 00:30:30campo dominio escribo el dominio a efe y
- 00:30:33net internet
- 00:30:34en el segundo dirección ip teníamos esta
- 00:30:37dirección ip 192 punto algo sé que la
- 00:30:42del servidor y esta función y net y un
- 00:30:45bajo a ddr como hemos visto antes para
- 00:30:47darle el formato adecuado a esto que
- 00:30:50hemos definido aquí está esta dirección
- 00:30:54en forma de screen
- 00:30:55vale el siguiente el campo del puerto
- 00:30:59utilizando h toms para adaptar el byte
- 00:31:03order al necesario el orden de los bytes
- 00:31:05al de la red igual que antes ahora esto
- 00:31:10es nuevo nos vamos a tratar de conectar
- 00:31:13el socket del cliente se va a tratar de
- 00:31:15conectar al socket del servidor
- 00:31:17elementos utilizar llamar al sistema
- 00:31:19connect primer argumento el file
- 00:31:22descriptor de ese socket que hemos
- 00:31:23creado para el cliente segundo esa
- 00:31:26estructura con sus campos un puntero a
- 00:31:28esta estructura para el servidor y el
- 00:31:31tercer argumento
- 00:31:33es un
- 00:31:35el valor de los bytes que mide los bytes
- 00:31:40que tiene esta estructura si connect es
- 00:31:43diferente a 0 si devuelve un valor
- 00:31:45distinto de 0 ha habido un error
- 00:31:47y primos en pantalla la conexión ha
- 00:31:50fallado con el servidor y este es este
- 00:31:53cliente es un poco tonto y termina el
- 00:31:55programa no vuelva a intentarlo
- 00:31:58si hemos tenido éxito es decir si
- 00:32:00conecte nos devuelve un cero e
- 00:32:03imprimimos un mensaje que diga conectado
- 00:32:05al servidor y ahora vamos a enviar datos
- 00:32:09entonces con la función rights vamos a
- 00:32:12el cliente va a enviar un dato o unos
- 00:32:15datos al servidor primer argumento el
- 00:32:17file descriptor de s socket el segundo
- 00:32:19argumento la información es el buffer de
- 00:32:22transmisión que contiene ese string que
- 00:32:25dice hola servidor soy un cliente y en
- 00:32:28tercer lugar el número de bytes que
- 00:32:29enviamos vale
- 00:32:33luego vamos a leer que nos responde él
- 00:32:37el servidor primer argumento el file
- 00:32:40descriptor del socket segundo el buffer
- 00:32:42en el que vamos a almacenar esos texto
- 00:32:45esos datos que nos va a enviar y en
- 00:32:46tercer lugar el número máximo de bytes
- 00:32:49que vamos a leer bien aquí en con el
- 00:32:53print efe
- 00:32:56se nos va a indicar se los va a sacar
- 00:32:58por pantalla qué mensaje hemos recibido
- 00:33:00del servidor el cliente recibe esto
- 00:33:02bueno en realidad después del reich
- 00:33:05debería comprobar que he leído he leído
- 00:33:07datos antes de poner este mensaje sin
- 00:33:11más
- 00:33:12por último lugar vamos a cerrar el
- 00:33:13socket con close cerramos de ese
- 00:33:16descriptor de archivo entonces el socket
- 00:33:19del cliente se desconecta el servidor lo
- 00:33:22va a detectar y el servidor por su parte
- 00:33:24también cerrará su file descriptor de su
- 00:33:26socket y podrá atender esto es un
- 00:33:29servidor secuencial podrá atender al
- 00:33:30siguiente cliente el servidor lo había
- 00:33:33creo fijado previamente ejecutándose
- 00:33:36había creado el socket
- 00:33:38estaría asociado a esa dirección ip y al
- 00:33:42puerto y estaba escuchando en ese puerto
- 00:33:44esperando a nuevos clientes
- 00:33:46primero voy a abrir wireshark que es el
- 00:33:48programa para hacer sniffing de paquetes
- 00:33:51wizard que lo tengo instalado en windows
- 00:33:53y luego ejecutar el cliente entonces al
- 00:33:59servidor el cliente los tengo conectado
- 00:34:00aquí bueno aparecen una serie de
- 00:34:02conexiones es ésta la que aparece wifi y
- 00:34:04de hecho nos indica que aquí hay tráfico
- 00:34:06y esta es la dirección ip de la tarjeta
- 00:34:12de windows ah pero como he dicho antes
- 00:34:15es virtual box está en modo bridge con
- 00:34:17esta tarjeta así que todas funcionan muy
- 00:34:19bien bien y estos son los paquetes que
- 00:34:22hay en nuestra red pero estos sean todos
- 00:34:24los dispositivos que hay conectados en
- 00:34:25mi red y yo lo que quiero hacer es
- 00:34:27filtrar solamente datos de mi servidor y
- 00:34:31de mí
- 00:34:33de mi cliente lo que necesito aquí es
- 00:34:35definir un filtro para que sólo se
- 00:34:39display en los solo aparezcan los las
- 00:34:42ips que yo quiero vale entonces aplicar
- 00:34:44este filtro
- 00:34:49vale no le puedo dar zoom pero lo que
- 00:34:51quiero es que solamente aparezcan los
- 00:34:54paquetes que provienen de la ip punto
- 00:34:56src ip source de esta o sea del servidor
- 00:35:00que sean iguales a este y cuyo destino
- 00:35:03sea ese
- 00:35:06es el cliente del cliente yo sé que
- 00:35:07tiene esta ip porque lo he mirado o que
- 00:35:11la dirección destino este es el símbolo
- 00:35:14lógico del por que la dirección ip
- 00:35:18fuente sea la del cliente y la de
- 00:35:20destino a la del servidor vale para eso
- 00:35:22se introduce este filtro bueno todavía
- 00:35:24no se muestra tráfico porque el servidor
- 00:35:27está esperando y el cliente lo tengo ahí
- 00:35:30lo tengo lo tengo que compilar en la
- 00:35:34otra máquina y ejecutarlo
- 00:35:39bueno en este momento que hemos
- 00:35:42ejecutado el cliente del cliente se ha
- 00:35:43ejecutado y ya ha terminado porque
- 00:35:45después porque solo se ha conectado ha
- 00:35:48enviado un texto y ha leído un texto del
- 00:35:50servidor bueno
- 00:35:51aquí están todas esas todos los paquetes
- 00:35:54del protocolo tcp que se han enviado
- 00:35:56desde el cliente al servidor que es el
- 00:35:59que intenta hacer la conexión y luego lo
- 00:36:01que el servidor le contesta al cliente
- 00:36:03donde están los datos esos esos datos
- 00:36:05esos textos que hemos enviado pues aquí
- 00:36:08si hago doble clic veo que el pei lotes
- 00:36:10pues sus ciertos estos el código nas y
- 00:36:14de su texto que enviado no hago doble
- 00:36:16clic y bueno aquí me parece de
- 00:36:18codificada toda esa secuencia de números
- 00:36:19y esto es lo que ha enviado el cliente
- 00:36:22vale y el cliente dice hola servidor soy
- 00:36:25un cliente entonces bueno está el áfrica
- 00:36:27correspondiente y el servidor dice hola
- 00:36:30cliente soy el servidor el cliente
- 00:36:32después cierra el archivo de el fight
- 00:36:35descriptor y termina la conexión y el
- 00:36:38cliente ahora o sea perdone el servidor
- 00:36:43lo que ocurre es bueno esto ya lo
- 00:36:45habíamos visto el socket se crea se
- 00:36:48asocia esa dirección ip se escucha en un
- 00:36:50puerto y en el momento en el que yo he
- 00:36:52ejecutado el cliente
- 00:36:54se imprime el mensaje que el cliente ha
- 00:36:59enviado a lo que el servidor ha recibido
- 00:37:01entonces el servidor le dé ese socket o
- 00:37:04la servidor soy un cliente y el servidor
- 00:37:08responde bueno imprimido aquí esa
- 00:37:11respuesta del servidor al cliente y
- 00:37:14cuando detecta que el cliente ha cerrado
- 00:37:16ese file descriptor
- 00:37:19el servidor imprime ese mensaje el
- 00:37:21cliente ha terminado y entonces el
- 00:37:24servidor estaría preparado para atender
- 00:37:26al próximo cliente voy a volver a
- 00:37:28ejecutar el cliente
- 00:37:35y vuelve a ocurrir lo mismo el cliente
- 00:37:38se conecta el servidor lee ese mensaje
- 00:37:43es esos datos que ha recibido del
- 00:37:44cliente o la servidor soy un cliente y
- 00:37:46luego se cierra
- 00:37:48bueno aquí termina este vídeo si hay
- 00:37:50errores que puedes indicarlo en los en
- 00:37:53los comentarios de abajo voy a dejar el
- 00:37:55código fuente en github dejo la
- 00:37:57dirección también abajo y si voy viendo
- 00:38:00errores lo sigue corrigiendo completando
- 00:38:02el código comentándolo etcétera y bueno
- 00:38:06si te ha gustado le das un like y si no
- 00:38:08pues después nada
- Sockets TCP
- Servidor Secuencial
- Sockets en C
- Comunicación entre Procesos
- Linux
- Intercambio de Datos
- Arquitectura de Red
- TCP versus UDP
- Programación de Redes
- VirtualBox