summaryrefslogtreecommitdiff
path: root/src/net_sdl
diff options
context:
space:
mode:
authororoborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-06-28 16:38:35 +0000
committeroroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-06-28 16:38:35 +0000
commit2d776fcd61be168e1ff0ff2e4a5e71835e7cea19 (patch)
tree7cf274897bf540d5332d446f583ffd066e4e2e1d /src/net_sdl
parentb877ae23ac5d380ab3aa48d7724045cf4883b186 (diff)
- prekopanie adresarovej struktury, prva cast
git-svn-id: http://opensvn.csie.org/tuxanci_ng@77 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src/net_sdl')
-rw-r--r--src/net_sdl/Makefile9
-rw-r--r--src/net_sdl/sdl_udp.c219
-rw-r--r--src/net_sdl/sdl_udp.h28
3 files changed, 256 insertions, 0 deletions
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 <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+
+#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 <SDL_net.h>
+
+#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