Professional Documents
Culture Documents
Client Server
socket socket
bind
listen
Establecimiento de accept
conexión
connect
(SYN)
write read
read write
Petición de cierre
close de
read
conexión
(FIN)
close
connect()
• Utilizada por el cliente para establecer una conexión
con un servidor.
int connect(int sockfd,
const struct sockaddr *serv_addr,
socklen_t addrlen);
1
listen()
• Se utiliza para definir el tamaño de la cola para almacenar el
número de conexiones entrantes pendientes de ser aceptadas.
accept()
• Utilizada por el servidor para aceptar conexiones de
clientes. Por defecto es una llamada bloqueante.
int accept(int sockfd,
struct sockaddr *client_addr, servidor
socklen_t *addrlen);
2
read()
• Lee los bytes de un descriptor. Por defecto es una llamada
bloqueante, si no hay bytes se quedará esperando.
write()
• Escribe los bytes en un descriptor. Puede ser una llamada
bloqueante, si el buffer de transmisión de TCP está lleno.
3
#define PUERTO_TCP 11000 Servidor TCP (I)
#define UNIXEPOCH 2208988800UL /* UNIX epoch, in UCT secs */
int main() {
int s, cs,leidos, escritos;
struct sockaddr_in srv_addr, client_addr;
socklen_t client_addr_len;
char buff[1];
time_t now;
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(PUERTO_TCP);
srv_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(s, (struct sockaddr *) &srv_addr, sizeof(srv_addr)<0) {
fprintf(stderr, "error en bind %s\n", strerror(errno));
exit(1);
}
if (listen(s, 5) <0) {
fprintf(stderr, "error en listen %s\n", strerror(errno));
exit(1);
}
time(&now);
now = htonl((unsigned long)(now + UNIXEPOCH));
close(cs);
} /* while */
} /* main */
Redes de Área Local 2007 31
4
Cliente TCP (I)
#define PUERTO_TCP 11000
#define UNIXEPOCH 2208988800UL /* UNIX epoch, in UCT secs */
#define MSG "Dime la hora"
int main() {
srv_addr.sin_family=AF_INET;
srv_addr.sin_port = htons(PUERTO_TCP);
srv_addr.sin_addr.s_addr = inet_addr(“10.0.0.1”);
if (escritos < 0) {
fprintf(stderr, "error en sendto %s\n", strerror(errno));
exit(1);
}
if (leidos < 0) {
fprintf(stderr, "error en sendto %s\n", strerror(errno));
exit(1);
}
close(s);
} /* main */
5
Netstat
• Netstat:
– Muestra las conexiones de red, tablas de encaminamiento,
estadísticas de interfaces de una máquina.
• Concurrente
– Permite que un servidor esté atendiendo
…
a varios clientes simultáneamente. Socket Socket Socket Socket
– El proceso servidor (proceso padre) crea pasivo conectado conectado conectado
un proceso hijo por cada petición de con un con un con un
cliente cliente cliente
conexión desde un cliente. Cada proceso
hijo atenderá las peticiones de su
cliente.
6
Servidor concurrente TCP (I)
#define PUERTO_TCP 11000
#define UNIXEPOCH 2208988800UL /* UNIX epoch, in UCT secs */
int main() {
int s, cs,leidos, escritos;
struct sockaddr_in srv_addr, client_addr;
socklen_t client_addr_len;
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(PUERTO_TCP);
srv_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(s, (struct sockaddr *) &srv_addr, sizeof(srv_addr)<0) {
fprintf(stderr, "error en bind %s\n", strerror(errno));
exit(1);
}
if (listen(s, 5) <0) {
fprintf(stderr, "error en listen %s\n", strerror(errno));
exit(1);
}
Servidor concurrente
TCP (II)
signal (SIGCHLD, termina_hijo);
while (1) {
memset(&client_addr, 0, sizeof(client_addr));
client_addr_len = sizeof(client_addr);
switch (fork()) {
case 0: /* proceso hijo */
close(s);
atiende_cliente(cs);
exit(0);
case 1: /* proceso padre */
close(cs);
break;
case -1:
fprintf(stderr, “error en fork %s\n”, strerror(errno));
exit(1);
}
} /* while */
} /* main */
Redes de Área Local 2007 37
7
Servidor concurrente TCP (III)
void atiende_cliente(int cs) {
int leidos, escritos;
char buff[1];
time_t now;
time(&now);
now = htonl((unsigned long)(now + UNIXEPOCH));
close(cs);