[Linux-programlama] UDP socket leri

---------

New Message Reply About this list Date view Thread view Subject view Author view Attachment view

From: Tufan BIYIKTAS (tufan.biyiktas@gmail.com)
Date: Fri 13 May 2005 - 05:13:58 EEST


Merhabalar,

sık kullandığım UDP socket leri ile ilgili olarak bir nebze olsun
kolaylık saglamak amacıyla
asağıdaki gibi bir kütüphane yazmaya calıstım fakat beceremedim.

sorun nerede acaba:???

srv, clnt nin yazdıklarını okuyamıyor
---------------------------------------------------
udp_lib2.h

/////////////////////////////////////////////////////////
// HEADER FILES
/////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

/////////////////////////////////////////////////////////
// frame type definition
/////////////////////////////////////////////////////////
typedef struct
{

int header;
int data;

}frame_t;

/////////////////////////////////////////////////////////
// node address type definition
/////////////////////////////////////////////////////////
typedef struct
{

char IPaddr[16];
int portaddr;

}nodeaddr_t;

/////////////////////////////////////////////////////////
// type definifion for UDP network connection
/////////////////////////////////////////////////////////
typedef struct
{

int sock;
struct sockaddr_in server;
struct sockaddr_in client;

}udp_t;

/////////////////////////////////////////////////////////
// initilaze given udp type of data using port
/////////////////////////////////////////////////////////
int udp_srv(udp_t *udp, nodeaddr_t nodeaddr)
{
int len = sizeof(udp->server);
struct hostent *host;

printf("\n getting socket ...\n");

if( (udp->sock = socket( PF_INET, SOCK_DGRAM,0) ) < 0 )
{
// error 1
return 0;
}

printf("\n socket taken ...\n");

memset(&(udp->client), 0, sizeof(udp->client));
/*
memset(&udp->server, 0, sizeof(udp->server));
udp->server.sin_family = AF_INET;
udp->server.sin_addr.s_addr = htonl(INADDR_ANY);
udp->server.sin_port = htons(nodeaddr.portaddr);
*/

if( !(host=gethostbyname(nodeaddr.IPaddr)) )
{
// error 6
printf("\n error 6 !!!\n");
return 0;
}
memset(&(udp->server),0,len);
udp->server.sin_family = AF_INET;
memcpy(&(udp->server.sin_addr),host->h_addr,host->h_length);
udp->server.sin_port = htons(nodeaddr.portaddr);

printf("\n binding ...\n");

if( (bind( udp->sock, (struct sockaddr *) &udp->server,
sizeof(udp->server) )) < 0 )
{
// error 2
printf("\n error 2 !!! \n");
return 0;
}

printf("\n binded ...\n");

if( getsockname(udp->sock, (struct sockaddr *) &udp->server, &(len) ) < 0 )
{
// error 3
printf("\n error 3 !!! \n");
return 0;
}

printf("\nSRV using port :%d ...\n",ntohs(udp->server.sin_port));

return 1;

}

/////////////////////////////////////////////////////////
// send msg
/////////////////////////////////////////////////////////
int udp_srv_send(udp_t udp, frame_t *frame)
{
int len = sizeof(udp.server);

if( (sendto(udp.sock, frame, sizeof(frame), 0,(struct sockaddr *)
&udp.client,len )) < 0)
{
// error 4
close(udp.sock);
return 0;
}

return 1;
}

/////////////////////////////////////////////////////////
// recevive msg
/////////////////////////////////////////////////////////
int udp_srv_recv(udp_t udp, frame_t *frame)
{
int len = sizeof(udp.server);

memset(frame, 0, sizeof(frame));

if( (recvfrom(udp.sock,frame,sizeof(frame),0,(struct sockaddr *)
&udp.client,&len )) < 0)
{
// error 5
close(udp.sock);
return 0;
}
/*
else{
printf("SRV=>%d\n",frame->data);
sleep(1);
}
*/
return 1;
}

/////////////////////////////////////////////////////////
// initilaze given udp type of data using port
/////////////////////////////////////////////////////////
int udp_clnt(udp_t *udp, nodeaddr_t nodeaddr)
{
int len = sizeof(udp->server);

struct hostent *host;

printf("\n gethostbyname ...\n");

if( !(host=gethostbyname(nodeaddr.IPaddr)) )
{
// error 6
printf("\n error 6 !!!\n");

return 0;
}

memset(&(udp->server),0,len);
udp->server.sin_family = AF_INET;
memcpy(&(udp->server.sin_addr),host->h_addr,host->h_length);
udp->server.sin_port = htons(nodeaddr.portaddr);

printf("\n getting socket ...\n");

if( (udp->sock = socket( PF_INET, SOCK_DGRAM,0) ) < 0 )
{
// error 7
printf("\n error 7 !!!\n");
return 0;
}

printf("\n socket taken ...\n");

memset(&(udp->client), 0, len);
udp->client.sin_family = AF_INET;
udp->client.sin_addr.s_addr = htonl(INADDR_ANY);
udp->client.sin_port = htons(nodeaddr.portaddr);

printf("\n binding ...\n");

if( (bind(udp->sock, (struct sockaddr *) &(udp->client), len)) < 0)
{
// error 8
return 0;
}

printf("\n binded ...\n");

return 1;
}

/////////////////////////////////////////////////////////
// send msg
/////////////////////////////////////////////////////////
int udp_clnt_send(udp_t udp, frame_t *frame)
{
int len = sizeof(udp.server);

if( (sendto(udp.sock, frame, sizeof(frame), 0,(struct sockaddr *)
&udp.server,len )) < 0)
{
// error 9
close(udp.sock);
return 0;
}

return 1;
}

/////////////////////////////////////////////////////////
// send msg
/////////////////////////////////////////////////////////
int udp_clnt_recv(udp_t udp, frame_t *frame)
{
int len = sizeof(udp.server);

memset(frame, 0, sizeof(frame));

if( (recvfrom(udp.sock, frame,sizeof(frame),0,(struct sockaddr *)
&udp.server,&len )) < 0)
{
// error 10
close(udp.sock);
return 0;
}

return 1;
}

---------------------------------------------------
srv.c

#include "udp_lib2.h"

int main()
{

udp_t srv;
frame_t frame;
nodeaddr_t nodeaddr;

strcpy(nodeaddr.IPaddr,"localhost");
nodeaddr.portaddr = 55555;

//frame->data = 0;

udp_srv(&srv,nodeaddr);

//strcpy(frame.data,"1234567890");

while(1)
{

udp_srv_recv(srv,&frame);

//write(fileno(stdout), frame.data, sizeof(frame.data));

printf("SRV =>%d\n",frame->data);
sleep(1);
}

return 0;
}

---------------------------------------------------
clnt.c

#include "udp_lib2.h"

int main()
{

udp_t clnt;
frame_t frame;
nodeaddr_t nodeaddr;
int index;

strcpy(nodeaddr.IPaddr,"localhost");
nodeaddr.portaddr = 55555;

udp_clnt(&clnt,nodeaddr);

index=0;
while(1)
{
//strcpy(frame.data,"a");
frame.data = index;

udp_clnt_send(clnt,&frame);
printf("CLNT=>%d\n", frame.data);
sleep(1);

index++;

}

//printf("CLNT>%s\n",frame.data);

return 0;
}

_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama


New Message Reply About this list Date view Thread view Subject view Author view Attachment view

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.