Red de conocimiento informático - Computadora portátil - Protocolo UDP en lenguaje C

Protocolo UDP en lenguaje C

Código de aprendizaje simple, solo como referencia:

server.c

#include?

#include?

#include?

#include?

#include?

#include?

#define?SERVICE_PORT 8080

#define?BUFSIZE?2048

#define?HEAD?4

int?main(int?argc,?char?**argv)

{

struct?sockaddr_in?myaddr ; /*?nuestra?dirección?*/

struct?sockaddr_in?remaddr; /*?remote?address?*/

socklen_t?addrlen?=?sizeof(remaddr); *?longitud?de?direcciones?*/

int?recvlen; /*?#?bytes?received?*/

int?fd; */

int?msgcnt?=?0; /*?count?#?de?mensajes?que?recibimos?*/

unsigned?char?buf[BUFSIZE] = "ret_"; /*?recibir?buffer?*/

/*?create?a?UDP?socket?*/

if?((fd?=?socket ( AF_INET,?SOCK_DGRAM,?0))?

perror("cannot?create?socket\n");

return?0;

p>

}

/*?vincular?el?socket?a?cualquier?dirección?IP?válida?y?un?puerto?específico?*/

memset ((char?*)&myaddr,?0,?sizeof(myaddr));

myaddr.sin_family?=?AF_INET;

myaddr.sin_addr.s_addr? =?htonl( INADDR_ANY);

myaddr.sin_port?=?htons(SERVICE_PORT);

if?(bind(fd,?(struct?sockaddr?*)&myaddr,? sizeof(myaddr) )?

perror("bind?failed");

return?0;

}

/*?ahora?bucle,?recibiendo?datos?e?imprimiendo?¿qué?recibimos?*/

¿para?(;;)?

{

printf("esperando?en?puerto?%d\n",?SERVICE_PORT);

recvlen?=?recvfrom(fd,?buf+HE

AD,?BUFSIZE,?0,?(struct?sockaddr?*)&remaddr,?&addrlen);

if?(recvlen?>?0)?

{

buf[HEAD+recvlen]?=?0;

printf("¿recibido?mensaje:?\"%s\"?(%d?bytes)\n",?buf+ HEAD ,?recvlen);

}

else

{

printf("¿uh?oh?-?algo?salió? mal !\n");

}

printf("¿enviando?respuesta?\"%s\"\n",?buf);

si ?(sendto(fd,?buf,?strlen(buf),?0,?(struct?sockaddr?*)&remaddr,?addrlen)?

{

perror("sendto");

}

}

close(fd);

return?0;

p>

}

client.c#include?

#include?

#include? < string.h>

#include?

#include?

#define?SERVICE_PORT 8080 < / p>

#define?BUFLEN?2048

int?main(?int?argc,char*?argv[]?)

{

struct?sockaddr_in?myaddr,?remaddr;

int?fd,?i,?slen=sizeof(remaddr);

char?sendbuf[BUFLEN]="hola"; / *?message?buffer?*/

char?readbuf[BUFLEN]={0};

int?recvlen /*?#?bytes?in?acknowledgement?message; ? */

char?*server?=?"127.0.0.1"; /*?cambiar?esto?para?usar?un?servidor?diferente?*/

/ * ?create?a?socket?*/

if?((fd=socket(AF_INET,?SOCK_DGRAM,?0))==-1)

{

printf("socket?created\n");

}

/*?vincularlo?a?todas?las?direcciones?locales?y?seleccionar?cualquiera ? puerto?número?*/

memset((char?*)&myaddr,?0,?sizeof(myaddr));

myaddr.sin_family?=?AF_INET;

myaddr.sin_addr.s_addr?=?htonl(INADDR_ANY);

myadd

r.sin_port?=?htons(0);

if?(bind(fd,?(struct?sockaddr?*)&myaddr,?sizeof(myaddr))?

{

perror("bind?failed");

return?0;

}

memset(( char?*)?&remaddr,?0,?sizeof(remaddr));

remaddr.sin_family?=?AF_INET;

remaddr.sin_port?=?htons(SERVICE_PORT);

if?(inet_aton(server,?&remaddr.sin_addr)==0)?

{

fprintf(stderr,?"inet_aton()?failed \n");

exit(1);

}

printf("¿Enviando?paquete?%d?to?%s?puerto?% d\n",?i,?server,?SERVICE_PORT);

if?(sendto(fd,?sendbuf,?strlen(sendbuf),?0,?(struct?sockaddr?*)&remaddr ,?slen)==-1)

{

perror("sendto");

exit(1);

}

/*?ahora?recibir?un?acuse de recibo?del?servidor?*/

recvlen?=?recvfrom(fd,?readbuf,?BUFLEN,?0 ,?(struct?sockaddr?*)&remaddr,?&slen);

if?(?recvlen?>=?0?)?

{

readbuf[recvlen]?=?0; /*?espera?a?printable?string?-?terminate?it?*/

printf("recibido?mensaje:?\"%s\"\ n",?readbuf);

}

close(fd);

return?0;

}

Si necesitas el proyecto completo, puedes contactarme.