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