Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Socketsjava Documentacion Resumen1
Socketsjava Documentacion Resumen1
Carné: 1690-19-16017
1690-19-9261
1690-10-6032
1690-19-20993
1690-19-32456
Semestre: quinto
Ciclo: 2021
Documentación Socket
IP
(Link)
(Physical)
3
Struct sockaddr
• Almacena información de la dirección del socket struct sockaddr { unsigned short
sa_family; // address family, AF_xxx char sa_data[14]; // 14 bytes of protocol
address
};
Struct sockaddr_in
• Sockaddr para TCP / IP struct sockaddr_in {
short int sin_family; // Address family unsigned short
int sin_port; // Port number struct in_addr sin_addr;
// Internet address
unsigned char sin_zero[8]; // Same size as struct sockaddr
};
6
struct in_addr sin_addr
• Dirección Internet (dirección IP)
• De esta forma si se declara ina del tipo type struct sockaddr_in, entonces
ina.sin_addr.s_addr referencia la dirección IP de 4 bytes (en Network Byte
Order).
la aplicación socket
buffers, TCP
sistema operativoControlado por el TCP con internet variablesbuffers,
con
sistema operativoControlado por el
variables
Aplicación Aplicación
Presentación Presentación
Sesión Sesión
Transporte Transporte
Red Red
Enlace Enlace
Física Física
OSI Model, DoD Model and TCP/IP Protocol Suit
inFromUser
clienteservidor:
(inFromServer
• El cliente lee stream)
una línea de la keyboard monitor
entrada
estándar
(inFromUser input
stream) , y la stream
inFromServer
outToServer
la línea del
desde el socket client TCP clientSocket
• El servidor
convierte la socket TCP
línea en socket
la envía al
cliente
Programación de Sockets con UDP
Interacción
UDP: cliente/servidor
sin “conexión” entre el con Socket
cliente y el servidorTCP
Servidor (corriendo sobre(saludo)
• sin handshaking ) Cliente
hostid
• El emisor
create socket, asocia
port=x, for
Punto de vista de la aplicación
explicitamente
incoming request: la dir. IP y UDP provee una transferencia no el
welcomeSocket =
puerto del destinatario
ServerSocket() fiablede grupos de bytes
TCP (datagramas) entre el cliente y el
Esperando por inic io de
conexión
• El servidor debe extraer servidor del, port=
solicitud de conexión
crea socket,
connect tohostid
clientSocket =
datagrama
x recibido, la
connectionSocket =
dir. IP y el puerto del
welcomeSocket.accept() Socket()
perder
UDP
Servidor (corriendo en ) Cliente
hostid
crea socket, crea socket,
port=x, para
clientSocket =
solicitud entrante:
DatagramSocket()
serverSocket =
DatagramSocket()
crea, dirección (hostid, port=x)
Envía datagrama de petición
Lee solicitud desde utilizando clientSocket
serverSocket
Escribe respuesta a
serverSocket Lee respuesta en
especificando la dir. del clientSocket
hots y el num. de puerto
cierra
clientSocket
Sockets
• Protocolos de Transporte:
XNS
TCP/IP
UNIX
• Tipos de Servicios
Datagramas: SOCK_DGRAM
Circuitos Virtuales:
• SOCK_STREAM
• SOCK_SECPACKED
• Especiales: SOCK_RAW
input
stream
Proceso
Process entrada: recibe
Cliente
paquete (TCP
salida: envía paquete recibe “flujo de
(TCP envía “flujo bytes”)
receivePacket
sendPacket
c l ient UDP
clientSocket
socket UDP
socket
bind Asocia una dirección IP, un puerto de la capa de transporte y una familia
de protocolos.
listen Crea una cola de peticiones de conexión.
socket() socket()
bind() bind()
recvfrom() sendto()
<petición>
recvfrom()
sendto()
<respuesta>
close() close()
Sockets: Servidor Concurrente
(a) Cliente y Servidor solicitan un socket al sistema
socket()
bind()
Sockets: Servidor Concurrente
(c) El Servidor reserva cola de espera e indica que está listo y
se bloquea esperando conexiones (pasivo)
listen()
accept()
connect()
Anexo: Ejemplos de programas con
Sockets
En este anexo se presentan ejemplos de programas
cliente-servidor. Los servicios son:
1/2
S e r v i d o r C o n c u r r e n t e (S o c k e t s S t r e a m ): srvTcp.c
// Recibe una cadena del Cliente y se la devuelve en mayusculas
#include <stdio.h>
#include <stdlib.h>
while(1){#include <sys/types.h> srvTcp.c
len = sizeof(struct
#include sockaddr_in);
<sys/socket.h> /* &len: entra y sale el tamano del socket esperado */
if((ss=accept(s,(struct sockaddr *)&fsock, &len)) < 0){ perror("ACCEPT: "); continue;
#include <netinet/in.h>
} printf("Conexion en el socket %d (antes %d)\n",ss,
s); if (fork() == 0) {
#define MAX_LINE 120
/* Aqui se ejecuta el proceso hijo */
extern int errno;
/* Cierra el socket incompleto */
/* se dedica a atender la conexion con el socket completo */
main() { struct
close(s); sockaddr_in
while(1){
lsock,fsock, sname; int s, ss; int
if((len=recv(ss,buf,MAX_LINE-1,0))<=0){ perror("RECV: "); /* Si len==0
len,i; char buf[MAX_LINE];
entonces el cliente cerro la conexion */ exit(1);
} for(i=0; i<len; i++) { /* Despliega y transforma a
Mayusculas */ putchar(buf[i]); if(buf[i]< >=
if((s=socket(AF_INET,SOCK_STREAM,0)) 0) 'a' && buf[i] <=
'z') {buf[i] = 'A' + (buf[i]
perror("SOCKET: "); -exit(0);
'a');
} putchar('\n');
} lsock.sin_family =if(buf[0] == 'Q' || buf[0] == 'q')
{ printf("Termina el servicio por decision del Cliente\n");
AF_INET;
close(ss); exit(0); /* el proceso hijo se mata */
lsock.sin_port = htons(4400); /* puerto para dar el servicio */
} if(send(ss,buf,len,0) < len) /* responde al
lsock.sin_addr.S_un.S_addr
cliente */ perror("SEND: ");
= 0; /* direccion IP de mi maquina servidora
}*/ if(bind(s,(struct
/*while sockaddr
*/ } /* if fork */ else *)&lsock, sizeof(struct
/* Aqui continua sockaddr_in))
el proceso vigia <
0 ){ perror("BIND:
para aceptar ");
otra conexion */ exit(1); /* el padre cierra el socket
close(ss);
} if(listen(s,3)<0)
completo que dejo al hijo */ } /*while*/
{ perror("LISTEN: "); 2/2
} exit(1);
}
1/2
C l i e n t e (S o c k e t s D a t a g r a m a ): clTCP.c
1/2
S e r v i d oS re (S
r voicdkoert(S
s oDc akteat gs r D
ama ta):
a gsrvUDP.c
r a m a): srvUDP.c
// Recibe una cadena del Cliente y se la devuelve en mayusculas
// Victor J. Sosa Sosa
// Lincar con -lxnet en la compilacion : gcc servidor.c -o ser -lxnet
#include <stdio.h>
#include
while(1){ <stdlib.h> espera mensaje de algun
printf("Servidor
#include <sys/types.h>
Cliente\n");
#include <sys/socket.h>
#include <netinet/in.h>
if((len=recvfrom(s,buf,MAX_LINE,0,&fsock,&lenS))<=0){
perror("RECVFROM: "); exit(1);
#define MAX_LINE 120
} for(i=0; i<len; i++) { /* Despliega y transforma a Mayusculas
extern int errno;
*/ putchar(buf[i]); if(buf[i] >= 'a' && buf[i] <= 'z') buf[i] =
'A' + (buf[i] - 'a');
main() { struct sockaddr_in
} putchar('\n'); if(buf[0] == 'Q' || buf[0] == 'q'){ printf("Un
lsock,fsock; int s; int len,i,
Cliente deja de Comunicarse con su Servidor\n");
lenS; char buf[MAX_LINE];
}
if(sendto(s,buf,len,0,&fsock,lenS) < len) /* responde al cliente */
if((s=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
perror("SEND: ");
perror("SOCKET: "); exit(0);
} /*while */
} } lsock.sin_family =
AF_INET;
lsock.sin_port = htons(4400); /* puerto para dar el servicio */
byte[] receiveData
sendData = new byte[1024]; byte[]
= capitalizedSentence.getBytes();
sendData = new byte[1024];
Crea datagrama para eníar al cliente DatagramPacket sendPacket = new
DatagramPacket(sendData, while(true)
sendData.length, IPAddress, port);
Escribe { el datagrama
serverSocket.send(sendPacket); al socket de salida
Crea un espacio para el datagrama recibido DatagramPacket
receivePacket =
} new Fin
DatagramPacket(receiveData,
del ciclo while, receiveData.length);
Java-tutorials:
• “All About Sockets” (Sun tutorial), http://www.javaworld.com/javaworld/jw-12-
1996/jw-12-sockets.html
• “Socket Programming in Java: a tutorial,”
http://www.javaworld.com/javaworld/jw-12-1996/jw-12-sockets.html