Aqui les dejo dos Ejemplos de Cliente/Servidor en lenguaje C.
Son de unas clases de la facu en la materia de sistemas distribuidos de ingenieria en informatica
- - - - - - - - - - - - - - - - - - - - - Ejemplo 1 - - - - - - - - - - - - - - - - - - - - -
Cliente 1
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#DEFINE PORT 3600
#DEFINE MAXDATASIZE 100
int main(int argc, char *argv[])
{
int fd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struck sockaddr_in server;
if (argc!=2)
{
printf("Usa:%<Direccion IP>n", argv[0];
esit(-1);
}
if (he=gethostbyname(argv[1]))==NULL)
{
printf("error en gethosbynamen" );
exit(-1);
}
if ((fd=socket(AF_INET, sock_stream,0)==-|)
{
printf("error en socketn" );
exit(-1);
}
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr=*((struct in_addr*) he->h_addr);
bzero(&(server.sin_zero),0);
if (connect(fd,(struct sockaddr*)&server, sizeof(struct sockaddr))==-1)
{
printf("error en connectn" );
exit(-1);
}
if (numbytes=recv(fd,buf,MAXDATASIZE,0))==-1)
{
printf("error en recvn" );
exit(-1);
}
buf[numbytes]='0';
printf("Mensaje del servidor:%n",buf);
close(fd);
}
Servidor 1
#include<stdio.h>
#include<sys/tpes.h>
#incuude<sys/socket.h>
#include<netinet/in.h>
#DEFINE PORT 3500
#DEFINE BACKLOG 2
main()
{
int fd, fd2;
struct sockaddr_in server;
struct sockaddr_in client;
int sn_size;
if ((fd=socket(AF_INET, SOCK_STREAM, 0))==1)
{
printf ("Error en socketn" );
exit(-1);
}
server.sin_family = AF_INET;
server.sin_port=htons(PORT);
server.sinaddrs.s_addr=INADDR_ANY;
bzero(&(server.sin_zero),8);
if (bind(fd,(strut sockaddr *) &server, sizeof(struct sockaddr))== -1)
{
printf("Error en bindn" );
exit(-1)
}
if (listen(fd, BAKLOG) == -1)
{
printf("Error en listenn" );
exit(-1);
}
while (1)
{
sin_size = sizeof(struct sockaddr_in);
if ((fd2=accept(fd,(struct sockaddr *)&client, &sin_size)) == -1)
{
printf ("error en accept n" );
exit(-1);
}
printf("Se conectaron desde %sn", inet_ntoa(client.sin_addr));
send(fd2, "Bienvenido a mi servidor!!!n",26, 0);
close(fd2);
}
}
- - - - - - - - - - - - - - - - - - - - - Ejemplo 2 - - - - - - - - - - - - - - - - - - - - -
Cliente 2
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/**********************************************************/
/* función MAIN */
/* Orden Parametros: IP destino, puerto , mensaje */
/* */
/**********************************************************/
main(int argc, char *argv[])
{
int s;
struct sockaddr_in bs,des;
char resp[255];
int *sd;
if (argc == 4)
{
// Creamos el socket
s = socket(AF_INET,SOCK_STREAM,0);
if (s != -1)
{
bs.sin_family = AF_INET;
bs.sin_port = htons(0); //Asigna un puerto disponible dela máquina
bs.sin_addr.s_addr = htonl(INADDR_ANY); //Asigna una IP de la máquina
//Asigna un nombre local al socket
if ( bind(s,(struct sockaddr*)&bs, sizeof(bs)) != -1)
{
//Se prepara el nombre de la máquina remota
des.sin_family = AF_INET;
des.sin_addr.s_addr = inet_addr(argv[1]);
des.sin_port = htons(atoi(argv[2]));
//Establece la conexión con la máquina remota
connect(s,(struct sockaddr*)&des,sizeof(des));
//Envía el mensaje
send(s,argv[3],strlen(argv[3])+1,0);
printf("nn->Enviando: %s, a: %s en el puerto: %s n",argv[3], argv[1], argv[2]);
//Recibe la respuesta
recv(s,resp, sizeof(resp) ,0);
printf("<-Recibido: %sn",resp);
//Se cierra la conexión (socket)
close(s);
}
else
{
printf("ERROR al nombrar el socketn" );
}
}
else
{
printf("ERROR: El socket no se ha creado correctamente!n" );
}
}
else
{
printf("nnaEl número de parámetros es incorrectonn" );
}
}
Servidor 2
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/**********************************************************/
/* función MAIN */
/* Orden Parametros: Puerto */
/* */
/**********************************************************/
main(int argc, char *argv[])
{
int s;
struct sockaddr_in bs, in;
char entrada[255];
int sd;
if (argc == 2)
{
// Creamos el socket
s = socket(AF_INET,SOCK_DGRAM,0);
if (s != -1)
{
bs.sin_family = AF_INET;
bs.sin_port = htons(atoi(argv[1])); //Asigna el puerto especificado por la línea de comandos
bs.sin_addr.s_addr = htonl(INADDR_ANY); //IP cualquiera de la máquina
//Asigna un nombre local al socket
if( bind(s,(struct sockaddr*)&bs, sizeof(bs)) != -1)
{
printf("naServidor ACTIVO escuchando en el puerto: %sn",argv[1]);
//El while permite atender a múltiples clientes
while (1)
{
//Recibe la cadena del cliente
if ( recvfrom(s,entrada, sizeof(entrada) ,0,(struct sockaddr*) &in, &sd)== -1)
perror("Error en recvfrom" );
//Devuelve la cadena al cliente
if (sendto(s,strcat(entrada, "" ; ) ,strlen(entrada)+1,0,(struct sockaddr*) &in, sizeof(in)) == -1)
perror("Error en sendto" );
}
//Se cierra el socket
close(s);
}
else
{
printf("ERROR al nombrar el socketn" );
}
}
else
{
printf("ERROR: El socket no se ha creado correctamente!n" );
}
}
else
{
printf("nnaEl número de parámetros es incorrectonn" );
}
}
Los codigos son basicos, pero espero que le sea de utilidad a alguien y si quieren compartir con mejoras en el codigo GENIAL para los que alguna vez necesiten!!
Son de unas clases de la facu en la materia de sistemas distribuidos de ingenieria en informatica
- - - - - - - - - - - - - - - - - - - - - Ejemplo 1 - - - - - - - - - - - - - - - - - - - - -
Cliente 1
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#DEFINE PORT 3600
#DEFINE MAXDATASIZE 100
int main(int argc, char *argv[])
{
int fd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struck sockaddr_in server;
if (argc!=2)
{
printf("Usa:%<Direccion IP>n", argv[0];
esit(-1);
}
if (he=gethostbyname(argv[1]))==NULL)
{
printf("error en gethosbynamen" );
exit(-1);
}
if ((fd=socket(AF_INET, sock_stream,0)==-|)
{
printf("error en socketn" );
exit(-1);
}
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr=*((struct in_addr*) he->h_addr);
bzero(&(server.sin_zero),0);
if (connect(fd,(struct sockaddr*)&server, sizeof(struct sockaddr))==-1)
{
printf("error en connectn" );
exit(-1);
}
if (numbytes=recv(fd,buf,MAXDATASIZE,0))==-1)
{
printf("error en recvn" );
exit(-1);
}
buf[numbytes]='0';
printf("Mensaje del servidor:%n",buf);
close(fd);
}
Servidor 1
#include<stdio.h>
#include<sys/tpes.h>
#incuude<sys/socket.h>
#include<netinet/in.h>
#DEFINE PORT 3500
#DEFINE BACKLOG 2
main()
{
int fd, fd2;
struct sockaddr_in server;
struct sockaddr_in client;
int sn_size;
if ((fd=socket(AF_INET, SOCK_STREAM, 0))==1)
{
printf ("Error en socketn" );
exit(-1);
}
server.sin_family = AF_INET;
server.sin_port=htons(PORT);
server.sinaddrs.s_addr=INADDR_ANY;
bzero(&(server.sin_zero),8);
if (bind(fd,(strut sockaddr *) &server, sizeof(struct sockaddr))== -1)
{
printf("Error en bindn" );
exit(-1)
}
if (listen(fd, BAKLOG) == -1)
{
printf("Error en listenn" );
exit(-1);
}
while (1)
{
sin_size = sizeof(struct sockaddr_in);
if ((fd2=accept(fd,(struct sockaddr *)&client, &sin_size)) == -1)
{
printf ("error en accept n" );
exit(-1);
}
printf("Se conectaron desde %sn", inet_ntoa(client.sin_addr));
send(fd2, "Bienvenido a mi servidor!!!n",26, 0);
close(fd2);
}
}
- - - - - - - - - - - - - - - - - - - - - Ejemplo 2 - - - - - - - - - - - - - - - - - - - - -
Cliente 2
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/**********************************************************/
/* función MAIN */
/* Orden Parametros: IP destino, puerto , mensaje */
/* */
/**********************************************************/
main(int argc, char *argv[])
{
int s;
struct sockaddr_in bs,des;
char resp[255];
int *sd;
if (argc == 4)
{
// Creamos el socket
s = socket(AF_INET,SOCK_STREAM,0);
if (s != -1)
{
bs.sin_family = AF_INET;
bs.sin_port = htons(0); //Asigna un puerto disponible dela máquina
bs.sin_addr.s_addr = htonl(INADDR_ANY); //Asigna una IP de la máquina
//Asigna un nombre local al socket
if ( bind(s,(struct sockaddr*)&bs, sizeof(bs)) != -1)
{
//Se prepara el nombre de la máquina remota
des.sin_family = AF_INET;
des.sin_addr.s_addr = inet_addr(argv[1]);
des.sin_port = htons(atoi(argv[2]));
//Establece la conexión con la máquina remota
connect(s,(struct sockaddr*)&des,sizeof(des));
//Envía el mensaje
send(s,argv[3],strlen(argv[3])+1,0);
printf("nn->Enviando: %s, a: %s en el puerto: %s n",argv[3], argv[1], argv[2]);
//Recibe la respuesta
recv(s,resp, sizeof(resp) ,0);
printf("<-Recibido: %sn",resp);
//Se cierra la conexión (socket)
close(s);
}
else
{
printf("ERROR al nombrar el socketn" );
}
}
else
{
printf("ERROR: El socket no se ha creado correctamente!n" );
}
}
else
{
printf("nnaEl número de parámetros es incorrectonn" );
}
}
Servidor 2
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/**********************************************************/
/* función MAIN */
/* Orden Parametros: Puerto */
/* */
/**********************************************************/
main(int argc, char *argv[])
{
int s;
struct sockaddr_in bs, in;
char entrada[255];
int sd;
if (argc == 2)
{
// Creamos el socket
s = socket(AF_INET,SOCK_DGRAM,0);
if (s != -1)
{
bs.sin_family = AF_INET;
bs.sin_port = htons(atoi(argv[1])); //Asigna el puerto especificado por la línea de comandos
bs.sin_addr.s_addr = htonl(INADDR_ANY); //IP cualquiera de la máquina
//Asigna un nombre local al socket
if( bind(s,(struct sockaddr*)&bs, sizeof(bs)) != -1)
{
printf("naServidor ACTIVO escuchando en el puerto: %sn",argv[1]);
//El while permite atender a múltiples clientes
while (1)
{
//Recibe la cadena del cliente
if ( recvfrom(s,entrada, sizeof(entrada) ,0,(struct sockaddr*) &in, &sd)== -1)
perror("Error en recvfrom" );
//Devuelve la cadena al cliente
if (sendto(s,strcat(entrada, "" ; ) ,strlen(entrada)+1,0,(struct sockaddr*) &in, sizeof(in)) == -1)
perror("Error en sendto" );
}
//Se cierra el socket
close(s);
}
else
{
printf("ERROR al nombrar el socketn" );
}
}
else
{
printf("ERROR: El socket no se ha creado correctamente!n" );
}
}
else
{
printf("nnaEl número de parámetros es incorrectonn" );
}
}
Los codigos son basicos, pero espero que le sea de utilidad a alguien y si quieren compartir con mejoras en el codigo GENIAL para los que alguna vez necesiten!!

