Codigo Fuente Cliente/Servidor en C

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!!

Fuentes de Información - Codigo Fuente Cliente/Servidor en C

El contenido del post es de mi autoría, y/o, es un recopilación de distintas fuentes.

Dar puntos
89 Puntos
Votos: 10 - T!score: 9/10
  • 1 Seguidores
  • 23.249 Visitas
  • 16 Favoritos

23 comentarios - Codigo Fuente Cliente/Servidor en C

@superra Hace más de 5 años
gracias che re piola!
@ardragonx Hace más de 4 años
wena
@freakosan Hace más de 4 años
Muchas gracias!
@Manu477 Hace más de 4 años
Podes subir el código fuente en un zip?
Si podes también adjuntame la libreria &quot;sys/socket.h&quot; que cuando instalas el visual studio 2008 no viene incluida. ¿Puede ser?
Gracias!
@maxitnr Hace más de 4 años
el codigo es para linux (lo digo para los q intenten compilarlo en windows no van a poder )
@rcorrea11 Hace más de 4 años
Pa' mis clases de S.O. Muchas gracias.
@oCovAo Hace más de 4 años
tienen demasiados errores, mejor me hice uno nuevo en vez de copiar estas chingaderas
@PZero21 Hace más de 3 años
Muy copado che +10
@valerx1 Hace más de 3 años
y los pcs cliente servidor se conectan con un cable cruzado ?
y la dirección ip y mascara de subred y puerta de enlace no se tuvieron que establecer o configurar previamente
en el pc servidor a través de windows ? ha.....

o es solamente una simulación en un mismo computador ?.. Humm....
@CasiqueCasimiro Hace 30 días
La red entre pc ya debe de existir previamente. esto es administrado por el SO.

La libreria socket.h funciona mediante llamados al SO.
@chusinho Hace más de 3 años
Genial ojala funciones +10
@fox180383 Hace más de 2 años
busca los errores si funciona no seas flojo los errores estan en las caritas que aparecen
oCovAo dijo:tienen demasiados errores, mejor me hice uno nuevo en vez de copiar estas chingaderas
@xsunderx Hace más de 2 años -1
lastima q es para linux
@Khra Hace más de 2 años
gracias por esto ty
@dralnus Hace más de 2 años
Te dejo mis 10 orale wey no mas.
@urielnj Hace más de 2 años
MUCHAS GRACIAS, APROBARLOS EN CYGWIN
@Facu3332 Hace más de 2 años
No es para linux, en windows tenes que agregar la ws2_32.lib y compila!
@natofe Hace más de 1 año
¿tienes los fuentes sin errores,por favor?, es que quiero probarlo y como no sé me cuesta mucho arreglarlos.
Gracias.
@natofe Hace más de 1 año
aaahí le hice una pequeña modificación y me funciono:
SERVIDOR:
=========

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h> // para los avisos del exit();

#define PORT 3500
#define BACKLOG 2

void main(){
int fd, fd2;
struct sockaddr_in server;
struct sockaddr_in client;
int sin_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.sin_addr.s_addr=INADDR_ANY;



bzero( &(server.sin_zero) ,8);
if (bind(fd,(struct sockaddr *) &server, sizeof(struct sockaddr))== -1){
printf("Error en bindn" );
exit(-1);
}

if (listen(fd, BACKLOG) == -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);
}
}
CLIENTE:
=======

#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 Parámetros: IP destino, puerto , mensaje
ejecutar: ./client 127.0.0.1 3500 hola
hola es el mensaje
******************************************************** */
main(int argc, char *argv[]){
int s;
struct sockaddr_in bs,des;
char resp[255];
int *sd; // este puntero aun no se para que es ¿?

if (argc == 4){
s = socket(AF_INET,SOCK_STREAM,0); // Creamos el socket
if (s != -1){
bs.sin_family = AF_INET; //Asigna un puerto disponible dela máquina
bs.sin_port = htons(0); //Asigna una IP de la máquina
bs.sin_addr.s_addr = htonl(INADDR_ANY); //Asigna un nombre local al socket
if ( bind(s,(struct sockaddr*)&bs, sizeof(bs)) != -1){
des.sin_family = AF_INET; //Se prepara el nombre de la máquina remota
des.sin_addr.s_addr = inet_addr(argv[1]);
des.sin_port = htons(atoi(argv[2]));
connect(s,(struct sockaddr*)&des,sizeof(des)); //Establece la conexión con la máquina remota
send(s,argv[3],strlen(argv[3])+1,0); //Envía el mensaje
printf("nn->Enviando: %s, a: %s en el puerto: %s n",argv[3], argv[1], argv[2]);
recv(s,resp, sizeof(resp) ,0); //Recibe la respuesta
printf("<-Recibido: %sn",resp);
close(s); //Se cierra la conexión (socket)
}
else{ printf("ERROR al nombrar el socketn" ); }
}else{ printf("ERROR: El socket no se ha creado correctamente!n" ); }
}else{ printf("nnEl número de parámetros es incorrectonn" ); }
}

Saludos
@iGeraNazgul Hace más de 1 año
Oigan tal vez mi duda sea un poco tonta pero al querer conectarlos pero en maquinas distintas no funcionan, nunca conectan.... por ejemplo Cliente2 y Servidor2, es decir el servidor en mi máquina lo levanto y el cliente en otra con la ip de mi maquina y nada mas nel, ¿alguna ayuda?...Gracias
@Devorad Hace más de 1 año
Como seria, para que el cliente genere un numero aleatorio y lo mande al servidor, en el ejemplo 2(cliente 2)?
@Knikni Hace más de 8 meses
El puto amo. Aqui tienes mi 10 porque 20 no puedo.
@alsuga1 Hace más de 8 meses
suba eso a github o algun repositorio, quedaria mejor gran aporte
@yomoxer1 Hace más de 7 meses
Gracias me sirvió de mucho para mi clase de S.O