Buenas, se me ha proporcionado un código de un servidor TCP con concurrencia aparente del servicio echo.
Código C:
Ver originalint main(void) {
int Fin = 0;
struct sockaddr_in cli_addr;
int cli_size, n, i;
int ms, cs, auxsock; /*Socket maestro, cliente y auxiliar*/
fd_set rfds; /*Conjunto de sockets para lectura*/
fd_set afds; /*Conjunto de sockets activos*/
FD_ZERO(&afds);
ms = passiveTCP("echo", 5);
if (ms == -1) Fin = 1;
FD_SET(ms, &afds);
while (Fin == 0) {
memcpy(&rfds
, &afds
, sizeof (rfds
)); if (select(FD_SETSIZE, &rfds, (fd_set*) 0, (fd_set*) 0, (struct timeval *) 0) == -1) {
/*Error fatal: fin de programa*/
return -1;
}
if (FD_ISSET(ms, &rfds)) {
/*Hay actividad sobre el socket maestro*/
cli_size = sizeof (cli_addr);
cs = accept(ms, (struct sockaddr*) &cli_addr, &cli_size);
if (cs != -1)
FD_SET(cs, &afds);
}
/*Comprobamos si hay actividad sobre el resto de sockets*/
for (i = 0; i < rfds.fd_count; i++) {
auxsock = rfds.fd_array[i];
if ((auxsock!ms) && (FD_ISSET(auxsock, &rfds))) {
n =recv(auxsock, buff, sizeof (buff), 0);
if ((n != SOCKET_ERROR) && (n > 0))
send(auxsock, buff, n, 0);
if (n == 0) {
close(auxsock);
FD_CLR(auxsock, &afds);
}
}
}
}
close(ms);
return 0;
}
Tengo las siguientes librerías incluidas:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
Me gustaría saber:
1-¿Qué librería/s debo incluir para resolver los problemas con passiveTCP y SOCKET_ERROR?
2-¿Cómo declaro buff?
3-¿Qué debería haber en realidad donde dice rfds.fd_count y rfds.fd_array?
4-Supóngase que éste servidor no es de echo, sino que recibe una cadena de caracteres, y tiene que guardarla en un vector char[] (se sabe que la longitud máxima del mensaje es 10000 caracteres). ¿Cómo se haría?