Redes de computadoras: ¿cómo escribo un programa de servidor utilizando sockets TCP y UDP en c?

Hay muchas posibilidades. Hoy en día, es muy común usar tecnologías asincrónicas para crear un servidor de socket de manera de evitar crear procesos (con fork ()) o subprocesos. Esto se debe a que es fácil recibir una conexión TCP y darle un subproceso o proceso para manejarla.

Un buen enfoque para crear soluciones asincrónicas es usar (libevent). Nginx es un muy buen ejemplo de aplicación de alto rendimiento con Libevent.

Pero, centrémonos en algo más fácil por ahora.

Supongamos que tiene dos funciones:

// Crear y manejar conexiones de socket tcp
voc tcp_server (int port) {

}

// Crear y manejar conexiones de socket udp
void udp_server (int port) {

}

Lo ha creado y probado ambos servidores y sabe que se está ejecutando correctamente. ¿De acuerdo?

Ahora, si desea ambos en la misma aplicación, y una manera fácil de hacerlo es abrir cada uno en un proceso específico usando fork ().

#include
#include
#include
#include
#include
#include

typedef void (* socket_handler) (puerto int);

retraso nulo () {
para (int i = 0; i <10; i ++)
dormir (1);
}

// Crear y manejar conexiones de socket tcp
voc tcp_server (int port) {
printf (“TCP:% d \ n”, puerto);

// Solo un retraso para simular un servidor
retrasar();

salida (0);
}

// Crear y manejar conexiones de socket udp
void udp_server (int port) {
printf (“UDP:% d \ n”, puerto);

// Solo un retraso para simular un servidor
retrasar();

salida (0);
}

int start_process (int port, socket_handler handler) {
pid_t pid;

pid = fork ();
if (pid <0) {
perror (“fork ()”);
volver -1;
}

if (pid == 0) {
// Controlador de inicio
manejador (puerto);
}

volver pid;
}

int main (int argc, char * argv []) {
pid_t tcp_pid = inicio_proceso (2222, tcp_server);
pid_t udp_pid = inicio_proceso (5555, udp_server);

printf (“Proceso TCP pid:% d ha comenzado \ n”, tcp_pid);
printf (“Proceso UDP pid:% d ha comenzado \ n”, udp_pid);

// Forma simple de terminar ambos procesos
hacer {
int estado;
pid_t finished_pid = waitpid (-1, & status, 0);

printf (“Proceso% d terminado \ n”, terminado_pid);

if (terminado_pid == tcp_pid)
tcp_pid = -1;
if (terminado_pid == udp_pid)
udp_pid = -1;

} while (tcp_pid! = -1 || udp_pid! = -1);

devuelve 0;
}

Una demostración en vivo: Ideone.com

En general, un servidor usará TCP o UDP, no ambos (no digo que esté equivocado al usar ambos, tengan paciencia conmigo). Dependiendo de sus objetivos para este proyecto y el idioma que desea usar, iniciar un servidor puede ser tan simple como un comando que especifica en qué puerto debe escuchar el servidor.

Supongo que lo que ha descrito es que debe crear un servidor TCP que escuche en algún puerto. Debería crear una conexión en respuesta a una solicitud de un cliente TCP (lo más probable es que tenga que hacer esto de tal manera que un solo servidor pueda admitir varios clientes).

UDP entra en juego cuando el servidor necesita enviar alguna información a TODOS los clientes, ya que TCP no admite mensajes de difusión.

Esto debería darle una idea suficiente para poder encontrar tutoriales en línea; avíseme si hay algo que deba aclararse.

Todas las respuestas a su pregunta, así como mucha otra buena información, se pueden encontrar en la Guía de programación de redes de Beej.

Debe crear dos sockets diferentes con dos números de puerto diferentes.

Buena suerte 🙂