Cliente y Server TCP
Ahora veremos un ejemplo de un cliente y un servidor TCP, en este caso el cliente se conecta al servidor y le envia un mensaje, el servidor recibe el mensaje y lo imprime en la terminal.
Cliente TCP
// Agregar Imports de Primer Conexion WiFi
#include "lwip/sockets.h" // Para sockets
#define SERVER_IP "192.168.0.247" // IP del servidor (su computador o raspberry)
#define SERVER_PORT 1234
// Agregar funciones de Primer Conexion WiFi (nv_init y wifi_init_sta)
void socket_tcp(){
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(SERVER_PORT);
inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr.s_addr);
// Crear un socket
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0) {
ESP_LOGE(TAG, "Error al crear el socket");
return;
}
// Conectar al servidor
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) != 0) {
ESP_LOGE(TAG, "Error al conectar");
close(sock);
return;
}
// Enviar mensaje "Hola Mundo"
send(sock, "hola mundo", strlen("hola mundo"), 0);
// Recibir respuesta
char rx_buffer[128];
int rx_len = recv(sock, rx_buffer, sizeof(rx_buffer) - 1, 0);
if (rx_len < 0) {
ESP_LOGE(TAG, "Error al recibir datos");
return;
}
ESP_LOGI(TAG, "Datos recibidos: %s", rx_buffer);
// Cerrar el socket
close(sock);
}
void app_main(void){
nvs_init();
wifi_init_sta(WIFI_SSID, WIFI_PASSWORD);
ESP_LOGI(TAG,"Conectado a WiFi!\n");
socket_tcp();
}
Primero podemos ver que se crea un socket con la función socket()
, luego se conecta al servidor con la función connect()
, luego se envia un mensaje con la función send()
, luego se recibe la respuesta con la función recv()
y finalmente se cierra el socket con la función close()
.
Este codigo funciona dentro del ejemplo dado en la Primera Conexion WiFi, solo se debe agregar la función socket_tcp()
dentro de la función app_main()
, ya que para utilizar un socket tcp y conectarte a la
red WiFi debes tener una conexión establecida.
Servidor TCP
import socket
HOST = '0.0.0.0' # Escucha en todas las interfaces disponibles
PORT = 1234 # Puerto en el que se escucha
# Crea un socket para IPv4 y conexión TCP
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
print("El servidor está esperando conexiones en el puerto", PORT)
while True:
conn, addr = s.accept() # Espera una conexión
with conn:
print('Conectado por', addr)
data = conn.recv(1024) # Recibe hasta 1024 bytes del cliente
if data:
print("Recibido: ", data.decode('utf-8'))
respuesta = "tu mensaje es: " + data.decode('utf-8')
conn.sendall(respuesta.encode('utf-8')) # Envía la respuesta al cliente
Por otro lado tenemos un servidor TCP, este servidor se queda esperando conexiones, cuando un cliente se conecta, recibe un mensaje y lo imprime en la terminal, luego envia una respuesta al cliente con el mensaje recibido.
Por lo menos el lado de Python se espera que sea conocido por el estudiante dado el ramo de Redes.