Академический Документы
Профессиональный Документы
Культура Документы
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
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
}
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)