From 2d776fcd61be168e1ff0ff2e4a5e71835e7cea19 Mon Sep 17 00:00:00 2001 From: oroborus Date: Sat, 28 Jun 2008 16:38:35 +0000 Subject: - prekopanie adresarovej struktury, prva cast git-svn-id: http://opensvn.csie.org/tuxanci_ng@77 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e --- src/net_sdl/Makefile | 9 +++ src/net_sdl/sdl_udp.c | 219 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/net_sdl/sdl_udp.h | 28 +++++++ 3 files changed, 256 insertions(+) create mode 100644 src/net_sdl/Makefile create mode 100644 src/net_sdl/sdl_udp.c create mode 100644 src/net_sdl/sdl_udp.h (limited to 'src/net_sdl') diff --git a/src/net_sdl/Makefile b/src/net_sdl/Makefile new file mode 100644 index 0000000..f0ffb5b --- /dev/null +++ b/src/net_sdl/Makefile @@ -0,0 +1,9 @@ + + +all: sdl_udp.o + +sdl_udp.o: sdl_udp.c sdl_udp.h + $(CC) $(CFLAGS) -o sdl_udp.o -c sdl_udp.c + +clean: + rm -rf *.o diff --git a/src/net_sdl/sdl_udp.c b/src/net_sdl/sdl_udp.c new file mode 100644 index 0000000..f30ba75 --- /dev/null +++ b/src/net_sdl/sdl_udp.c @@ -0,0 +1,219 @@ + + +#include +#include +#include +#include +#include + +#include "base/main.h" +#include "net_sdl/sdl_udp.h" + +#define BUFSIZE 1000 + + +sock_sdl_udp_t* newSdlSockUdp() +{ + sock_sdl_udp_t *new; + + new = malloc( sizeof(sock_sdl_udp_t) ); + memset(new, 0, sizeof(sock_sdl_udp_t)); + + if( !( new->packet = SDLNet_AllocPacket(512) ) ) + { + fprintf(stderr, "nemozem alokovat pamat pre packet !\n"); + destroySockSdlUdp(new); + } + + return new; +} + +void destroySockSdlUdp(sock_sdl_udp_t *p) +{ + assert( p != NULL ); + + SDLNet_FreePacket(p->packet); + free(p); +} + +sock_sdl_udp_t* bindSdlUdpSocket(int port) +{ + sock_sdl_udp_t *new; + + assert( port > 0 && port < 65535 ); + + new = newSdlSockUdp(); + + assert( new != NULL ); + + if( SDLNet_Init() < 0 ) + { + fprintf(stderr, "nemozem initcializovat SDLnet !\n"); + destroySockSdlUdp(new); + return NULL; + } + + if( !( new->sock = SDLNet_UDP_Open(port) ) ) + { + fprintf(stderr, "nemozem otovrit socket !\n"); + destroySockSdlUdp(new); + return NULL; + } + + new->type = SDL_UDP_SERVER; + + return new; +} + +sock_sdl_udp_t* connectSdlUdpSocket(char *address, int port) +{ + sock_sdl_udp_t *new; + + assert( address != NULL ); + assert( port > 0 && port < 65536 ); + + new = newSdlSockUdp(); + + assert( new != NULL ); + + /* Initialize SDL_net */ + if( SDLNet_Init() < 0 ) + { + fprintf(stderr, "nemozem initcializovat SDLnet !\n"); + destroySockSdlUdp(new); + return NULL; + } + + /* Open a socket on random port */ + if( !( new->sock = SDLNet_UDP_Open(0) ) ) + { + fprintf(stderr, "nemozem otovrit socket !\n"); + destroySockSdlUdp(new); + return NULL; + } + + /* Resolve server name */ + if( SDLNet_ResolveHost(&(new->srvadd), address, port) ) + { + fprintf(stderr, "nemozem sa pripojit na sokcet !\n"); + destroySockSdlUdp(new); + return NULL; + } + + new->type = SDL_UDP_CLIENT; + + return new; +} + +int readSdlUdpSocket(sock_sdl_udp_t *src, sock_sdl_udp_t *dst, void *address, int len) +{ + int x; + + if( SDLNet_UDP_Recv(src->sock, dst->packet) ) + { + x = (dst->packet->len > len ? len : dst->packet->len); + memcpy(address, dst->packet->data, x); + return x; + } + + return -1; +} + +int writeSdlUdpSocket(sock_sdl_udp_t *src, sock_sdl_udp_t *dst, void *address, int len) +{ + assert( src != NULL ); + assert( address != NULL ); + +#ifdef DEBUG_LOST_PACKET + if( rand() % DEBUG_LOST_PACKET == 0 ) + { + printf("debug lost packet %s\n", address); + return size; + } +#endif + + memcpy(dst->packet->data, address, len); + dst->packet->len = len; + + if( src->type == SDL_UDP_CLIENT ) + { + dst->packet->address.host = src->srvadd.host; + dst->packet->address.port = src->srvadd.port; + } + + SDLNet_UDP_Send(src->sock, -1, dst->packet); + + return len; +} + +int getSockSdlUdpPort(sock_sdl_udp_t *p) +{ + assert( p != NULL ); + + return p->packet->address.port; +} + + +void closeSdlUdpSocket(sock_sdl_udp_t *p) +{ + assert( p != NULL ); + + SDLNet_UDP_Close(p->sock); + + printf("close connect\n"); + + destroySockSdlUdp(p); +} + +#if 0 +int main(int argc, char *argv[]) +{ + sock_sdl_udp_t *sock; + char buf[BUFSIZE]; + int ret; + + if( strcmp(argv[1], "s") == 0 ) + { + sock_sdl_udp_t *cli; + + sock = bindSdlUdpSocket( atoi(argv[2]) ); + cli = newSdlSockUdp(); + + while(1) + { + memset(buf, 0, BUFSIZE); + + ret = readSdlUdpSocket(sock, cli, buf, BUFSIZE); + + if( ret > 0 ) + { + writeSdlUdpSocket(sock, cli, buf, ret); + } + } + } + + if( strcmp(argv[1], "c") == 0 ) + { + sock = connectSdlUdpSocket("127.0.0.1", atoi(argv[2])); + + strcpy(buf, "Hello world !\n"); + writeSdlUdpSocket(sock, sock, buf, strlen(buf)); + + while(1) + { + memset(buf, 0, BUFSIZE); + ret = readSdlUdpSocket(sock, sock, buf, BUFSIZE); + + if( ret > 0 ) + { + printf("buf = %s", buf); + } + } + + closeSdlUdpSocket(sock); + } + + return 0; +} + +#endif diff --git a/src/net_sdl/sdl_udp.h b/src/net_sdl/sdl_udp.h new file mode 100644 index 0000000..91a3c71 --- /dev/null +++ b/src/net_sdl/sdl_udp.h @@ -0,0 +1,28 @@ + +#ifndef MY_SDL_UDP + +#include + +#define MY_SDL_UDP + +#define SDL_UDP_SERVER 0 +#define SDL_UDP_CLIENT 1 + +typedef struct struct_sock_sdl_udp_t +{ + int type; + UDPsocket sock; + IPaddress srvadd; + UDPpacket *packet; +} sock_sdl_udp_t; + +sock_sdl_udp_t* newSdlSockUdp(); +void destroySockSdlUdp(sock_sdl_udp_t *p); +sock_sdl_udp_t* bindSdlUdpSocket(int port); +sock_sdl_udp_t* connectSdlUdpSocket(char *address, int port); +int readSdlUdpSocket(sock_sdl_udp_t *src, sock_sdl_udp_t *dst, void *address, int len); +int writeSdlUdpSocket(sock_sdl_udp_t *src, sock_sdl_udp_t *dst, void *address, int len); +int getSockSdlUdpPort(sock_sdl_udp_t *p); +void closeSdlUdpSocket(sock_sdl_udp_t *p); + +#endif -- cgit v1.2.3