summaryrefslogtreecommitdiff
path: root/src/sdl_udp.c
diff options
context:
space:
mode:
authororoborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-03-16 13:45:40 +0000
committeroroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-03-16 13:45:40 +0000
commit2c160370499826609371fa9621b8c31aa8a8566a (patch)
tree6941e47adc9915c03709f450450e02fda524f288 /src/sdl_udp.c
parentb84b59153c587248ca8a6a94a6d93977e851233f (diff)
- siete boli prepisane do SDL_net
git-svn-id: http://opensvn.csie.org/tuxanci_ng@19 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src/sdl_udp.c')
-rw-r--r--src/sdl_udp.c209
1 files changed, 209 insertions, 0 deletions
diff --git a/src/sdl_udp.c b/src/sdl_udp.c
new file mode 100644
index 0000000..a8eae7a
--- /dev/null
+++ b/src/sdl_udp.c
@@ -0,0 +1,209 @@
+
+
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <assert.h>
+#include "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 );
+
+ 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