Академический Документы
Профессиональный Документы
Культура Документы
Procesos de Aplicación
Los procesos acceden a TCP y UDP por Puertos
Proceso Proceso
P
TCP UDP socket
TC
Winsock) socket
n
xió
socket
ne
Co
Servidor socket
ICMP, ARP , IP Red Oculto en el S.O. sobre TCP
cliente
RARP
socket
socket
proceso proceso
Enlace
802.3 sobre UDP
socket socket
sobre UDP
Relación UDP
1
El socket como descriptor para E/S Puntos de conexión
El socket se asocia a un puerto y dirección IP locales
Un socket es un mecanismo de comunicación entre
La estructura depende de la familia de protocolos
procesos del mismo o de sistemas diferentes
Se identifica por un descriptor similar al de ficheros
struct sockaddr sockaddr sockaddr_in
{
Tabla de descriptores u_short sin_family; sa_len sin_len
Estructura para fichero 0 char sin_zero[14]; sa_family AF_INET
0 } sin_port
Estructura para fichero 1
1 sin_addr
2 Family: PF_INET #include <netinet/in.h>
sa_data
Service: SOCK_STREAM
3 Local IP: 111.22.3.4 struct sockaddr _in sin_zero
{
4 Remote IP: 123.45.6.78 u_short sin_family;
Local Port: 2249 u_short sin_port;
Remote Port: 3726 u_long sin_addr ;
char sin_zero[];
}
‘s’ : short (16bit) ‘l’ : long (32bit) if (argc > 2) { /* if protocol port specified */
port = atoi(argv[2]); /* convert to binary */
} else {
uint16_t htons(uint16_t); port = PROTOPORT; /* use default port number */
}
uint16_t ntohs(uint_16_t); if (port > 0) /* test for legal value */
sad.sin_port = htons((u_short)port);
else {
fprintf(stderr ,"bad port number %s\n",argv[2]);
uint32_t htonl(uint32_t); exit(1);
uint32_t ntohl(uint32_t); }
ptrh = gethostbyname(host);
if ( ((char *)ptrh) == NULL ) {
fprintf(stderr ,"invalid host: %s\n", host); Crea la estructura para el descriptor
exit(1);
}
memcpy (&sad.sin_addr, ptrh->h_addr, ptrh->h_length);
2
Funciones básicas para TCP Funciones básicas para TCP
RETURN VALUES int sd; /* socket descriptor
A -1 is returned if an error occurs. Otherwise the return
value is a descriptor referencing the socket. */
…...
ERRORS
The socket() call fails if: /* Create a socket. */
EACCES
Permission to create a socket of the specified type sd = socket(PF_INET, SOCK_STREAM, ptrp->p_proto);
and/or protocol is denied. if (sd < 0) {
EMFILE fprintf(stderr , "socket creation failed\n");
The per -process descriptor table is full. exit(1);
ENOMEM }
Insufficient user memory is available.
EPROTONOSUPPORT
The protocol type or the specified protocol is not
supported within this domain.
VER MANUAL !!
name punto de conexión local !!! if (bind(sd, (struct sockaddr *)&sad, sizeof (sad)) < 0) {
fprintf(stderr ,"bind failed\n");
exit(1);
}
3
Funciones básicas para TCP Funciones básicas para TCP
int listen(int s, int maxconec); int sd; /* socket descriptor */
…...
if (bind(sd, (struct sockaddr *)&sad, sizeof (sad)) < 0) {
fprintf(stderr ,"bind failed\n");
exit(1);
maxconec conexiones + peticiones pendientes }
Por defecto se bloquea hasta que haya datos La escritura puede ser menor que el valor max.
disponibles. Los bytes reales escritos constituyen el valor de
La lectura puede ser menor que el valor max. Los retorno de la llamada.
bytes reales leídos constituyen el valor de
retorno de la llamada.
4
Funciones básicas para TCP Funciones para UDP
l Cierre de la conexión l Creación:
– socket( PF_INET, SOCK_DGRAM, 0)
– Cualquiera de los extremos puede efectuar la
l Envío de un datagrama:
desconexión.
– sendto(int sockfd, void *buff, size_t nbytes,
int flags, const struct sockaddr* to,
socklen_t addrlen)
– Llamada al sistema:
l Recepción de un datagrama:
l close(int fd);
– recvfrom(int sockfd, void *buff, size_t
nbytes, int flags, struct sockaddr* to,
socklen_t *fromaddrlen)
5
Bases de datos de Red Bases de datos de Red
gethostbyaddr l Otras funciones de la librería:
struct hostent *gethostbyaddr(const char *addr, – uname: obtiene el nombre de la máquina
size_t len, /* sizeof(struct in_addr) */ – getservbyname: obtiene el puerto asignado a un
int family); /* AF_INET */ servicio concreto, en /etc/services
l Aquí nos interesa el campo h_name de la – getprotobyname: devuelve el identificador de un
estructura hostent. protocolo conocido por la máquina, en
/etc/protocols.
l Ante un error, devuelve NULL y da un
– getnetbyname: identifica la dirección asignada a
valor a la variable global h_errno una red, en /etc/networks