Você está na página 1de 6

Prctica 1B.

Comunicacin con sockets


Introduccin a las comunicaciones en red
Programa1g.c Capture, compile y ejecute el siguiente programa de creacin de un cliente con
sockets. Observe su funcionamiento. Servidor.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/utsname.h>
#include <sys/un.h>
#define PuertoTCP 7000
main()
{
int sfd,bin,nsfd,cli_addr_len,pid;
char bufs[1024];
char bufr[1024];
if((sfd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("Creando el socket");
exit(-1);
}
struct sockaddr_in test, cli_addr;
test.sin_family = AF_INET;
test.sin_addr.s_addr = inet_addr("127.0.0.1");
test.sin_port = htons(PuertoTCP);
if(bind(sfd,&test,sizeof(test)) == -1)
{
perror("En el bind");
exit(-1);
}
if(listen(sfd,1) == -1)
{
perror("Al escuchar");
exit(-1);
}
for(;;)
{
cli_addr_len = sizeof(cli_addr);
if((nsfd = accept(sfd,&cli_addr,&cli_addr_len)) == -1)
{
perror("Al aceptar");
exit(-1);
}
if((pid=fork())==0)
{
1

while(1)
{
recv(nsfd,bufr,1024,0);
printf("Mensaje del cliente:%s\n",bufr);
printf("Escribe mensaje\n");
fgets(bufs,1024,stdin);
send(nsfd,bufs,1024,0);
}
}
else
{
waitpid(getpid()+1);
}
}
}
Programa1h.c Capture, compile y ejecute el siguiente programa de creacin de un cliente con
sockets. Observe su funcionamiento. Cliente.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define PuertoTCP 7000
main()
{
char bufs[1024];
char bufr[1024];
int sfd,bin;
if((sfd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("Creando el socket");
exit(-1);
}
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(PuertoTCP);
if(connect(sfd,&server,sizeof(server))==-1)
{
perror("Conexion");
exit(-1);
}
while(1)
{
printf("Escribe mensaje\n");
fgets(bufs,1024,stdin);
send(sfd,bufs,1024,0);
recv(sfd,bufr,1024,0);
2

printf("Mensaje del servidor:%s\n",bufr);


}
exit(0);
close(sfd);
}
Programa1i.c Modifique el programa cliente Programa1h.c para poder ejecutarlo en una
mquina diferente al servidor. (30% de la calificacin de la prctica)

Sockets UDP
En la presente seccin nos concentraremos en crear un servidor que utiliza el protocolo de
datagrama de usuario (UDP), el cual al no ser orientado a conexin, no garantiza que los mensajes
emitidos sean recibidos, ni tampoco que el orden en que se envan los paquetes sea el mismo que
cuando se reciben. Sin embargo tiene la ventaja sobre el protocolo TCP en que es ms rpido y
genera menor trfico de red si se implemente correctamente.
La estructura sockaddr es utilizada por muchas llamadas al sistema y tiene la forma:
struct sockaddr
{
u_short sa_family;
char sa_data[14];
}
La estructura que almacena la direccin genrica de un socket:
struct sockaddr_un
{
short sun_family; /*AF_UNIX*/
char sun_path[108]; /*Ruta */
};
Para el caso de socket internet se usa la estructura:
struct sockaddr_in
{
short sin_family; /* AF_INET */
u_short sin_port; /* 16 bits con el nmero de puerto */
struct in_addr sin_addr; /* 32 bits con la identificacin de la red y del nodo */
char sin_zero[8]; /* 8 bytes no usados */
}
donde
struct in_addr
{
u_long s_addr; /* 32 bits que contienen la identificacin de la red y del nodo */
};
Programa1j.c Edite, compile, ejecute, analice y explique el siguiente programa.
3

/* Ejemplo sobre datagrama en el dominio PF_UNIX */


/* Extremo receptor */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#define NAME "socketdir"
main () {
int sock, length, lon2;
struct sockaddr_un name;
char buf[1024];
sock=socket(PF_UNIX, SOCK_DGRAM, 0);
if (sock<0) {
perror("Abriendo socket de datagrama");
exit(1);
}
name.sun_family=AF_UNIX;
strcpy(name.sun_path, NAME);
if (bind(sock, (struct sockaddr *) &name,
sizeof(name))<0) {
perror("Asociando nombre al socket");
exit(1);
}
printf("Direccion del socket -->%s\n", NAME);
if (recvfrom(sock, buf, 1024, 0, NULL, &lon2) < 0)
perror("Recibiendo un datagrama");
printf("--> %s\n", buf);
close(sock);
unlink(NAME);
exit(0);
}
Programa1k.c Edite, compile, ejecute, analice y explique el siguiente programa.
/* Ejemplo sobre datagramas en el dominio PF_UNIX */
/* Extremo emisor */
# include <sys/types.h>
# include <sys/socket.h>
# include <sys/un.h>
# include <stdio.h>
# include <stdlib.h>
# define DATA "Este es el mensaje..."
main(int argc, char *argv[]) {
int sock;
struct sockaddr_un name;
sock=socket (PF_UNIX, SOCK_DGRAM, 0);
if (sock<0) {
perror("Abriendo socket de datagramas");
exit(1);
4

}
name.sun_family=AF_UNIX;
strcpy(name.sun_path, argv[1]);
if (sendto(sock, DATA, strlen(DATA)+1, 0,
(struct sockaddr *)&name, sizeof name) < 0)
perror("Enviado un datagrama");
close(sock);
exit(0);
}
Programa1l.c Edite, compile, ejecute, analice y explique el siguiente programa. Servidor
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#define PUERTO
3000
#define TAM_MAX 1024
int main()
{
int desc_socket, tam_dest;
struct sockaddr_in direc, dest;
char *bufer="Saludos a todos desde el servidor";
char men[TAM_MAX];
printf("Inicio\n");
desc_socket=socket(AF_INET,SOCK_DGRAM,0);
bzero(&direc,sizeof(direc));
direc.sin_family = AF_INET;
direc.sin_port = htons(PUERTO);
direc.sin_addr.s_addr = INADDR_ANY;
bind(desc_socket,(struct sockaddr*)&direc,sizeof(direc));
tam_dest=sizeof(dest);
recvfrom(desc_socket,men,strlen(men)+1,0,(struct sockaddr *)&dest,&tam_dest);
printf("Conectado...\n");
sendto(desc_socket,bufer,strlen(bufer)+1,0,(struct sockaddr *)&dest,sizeof(dest));
close(desc_socket);
return 0;
}
Programa1m.c Edite, compile, ejecute, analice y explique el siguiente programa. Cliente.
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <resolv.h>
#define PUERTO 3000
#define DIR_SERV "127.0.0.1"
#define TAM_MAX
1024
5

int main()
{
int desc_socket, tam_estruc;
struct sockaddr_in dest;
char bufer[TAM_MAX];
char *men="Iniciando";
if ((desc_socket=socket(AF_INET,SOCK_DGRAM,0))<0)
{
perror("Socket");
exit(errno);
}
bzero(&dest, sizeof(dest));
dest.sin_family = AF_INET;
dest.sin_port = htons(PUERTO);
if (inet_aton(DIR_SERV,&dest.sin_addr.s_addr)==0)
{
perror(DIR_SERV);
exit(errno);
}
sendto(desc_socket,men,sizeof(men)+1,0,(struct sockaddr *)&dest,sizeof(dest));
bzero(bufer,TAM_MAX);
tam_estruc=sizeof(dest);
recvfrom(desc_socket,bufer,sizeof(bufer),0,(struct sockaddr *)&dest,&tam_estruc);
printf("%s", bufer);
close(desc_socket);
return 0;
}
Programa1n.c Modifique el programa cliente Programa1m.c, para que se puedan ejecutar en
otra mquina, diferente a la del servidor. (40% de la calificacin de la prctica)

Você também pode gostar