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))?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) )?0)?{
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)?0)
{
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; p >
myaddr.sin_addr.s_addr?=?htonl(INADDR_ANY);
myadd
r.sin_port?=?htons(0);
if?(bind(fd,?(struct?sockaddr?*)&myaddr,?sizeof(myaddr))?0)?
{
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.