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.
- Protocolos de red: en el protocolo de enlace TCP 3, ¿por qué necesitamos el tercer ACK?
- ¿Será absurdo el conocimiento de redes de protocolos en la era SDN?
- ¿Cuál es el papel del protocolo TCP / IP en el funcionamiento de Internet?
- ¿Cuál es la diferencia entre NetBIOS y SMB?
- ¿Qué capa opera el protocolo DNP3? Si un requisito dice que DNP3 debe operar sobre TCP / IP, ¿qué significa eso?
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