diff --git a/examples/simple_java/udp_decoder.c b/examples/simple_java/udp_decoder.c new file mode 100644 index 0000000000000000000000000000000000000000..a61b0de632a46b54ecf7e12e4e8c857904cce7d6 --- /dev/null +++ b/examples/simple_java/udp_decoder.c @@ -0,0 +1,39 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <labcomm_udp_reader_writer.h> +#include "gen/simple.h" +//#include "/home/sven/slask/UDP/udp_hack.h" +#include "udp_hack.h" + +static void handle_simple_TwoInts(simple_TwoInts *v,void *context) { + printf("Got TwoInts. a=%d, b=%d\n", v->a, v->b); +} + +static void handle_simple_IntString(simple_IntString *v,void *context) { + printf("Got IntString. x=%d, s=%s\n", v->x, v->s); +} + +int main(int argc, char *argv[]) { + server_context_t *fd; + struct labcomm_decoder *decoder; + void *context = NULL; + int i, j; + + char *filename = argv[1]; + fd = server_init(); + decoder = labcomm_decoder_new(labcomm_udp_reader, fd); + if (!decoder) { + printf("Failed to allocate decoder %s:%d\n", __FUNCTION__, __LINE__); + return 1; + } + + labcomm_decoder_register_simple_TwoInts(decoder, handle_simple_TwoInts, context); + labcomm_decoder_register_simple_IntString(decoder, handle_simple_IntString, context); + + printf("Decoding:\n"); + labcomm_decoder_run(decoder); + printf("--- End Of File ---:\n"); + labcomm_decoder_free(decoder); + server_exit(fd); +} diff --git a/examples/simple_java/udp_encoder.c b/examples/simple_java/udp_encoder.c new file mode 100644 index 0000000000000000000000000000000000000000..bce25ef57debb89dd08f7aa4ca61847b2104dbde --- /dev/null +++ b/examples/simple_java/udp_encoder.c @@ -0,0 +1,32 @@ +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <labcomm_udp_reader_writer.h> +#include "gen/simple.h" +//#include "/home/sven/slask/UDP/udp_hack.h" +#include "udp_hack.h" + +int main(int argc, char *argv[]) { + server_context_t *fd; + struct labcomm_encoder *encoder; + int i, j; + + char *filename = argv[1]; + fd = client_init(); + encoder = labcomm_encoder_new(labcomm_udp_writer, fd); + labcomm_encoder_register_simple_TwoInts(encoder); + labcomm_encoder_register_simple_IntString(encoder); + simple_IntString is; + is.x = 24; + is.s = "Hello, LabComm!"; + printf("Encoding IntString, x=%d, s=%s\n", is.x, is.s); + labcomm_encode_simple_IntString(encoder, &is); + + simple_TwoInts ti; + ti.a = 13; + ti.b = 37; + printf("Encoding TwoInts, a=%d, b=%d\n", ti.a, ti.b); + labcomm_encode_simple_TwoInts(encoder, &ti); + + client_exit(fd); +} diff --git a/lib/c/labcomm_udp_reader_writer.c b/lib/c/labcomm_udp_reader_writer.c new file mode 100644 index 0000000000000000000000000000000000000000..66b9311a7c1a03ed90ba56b04274293f9fc93c96 --- /dev/null +++ b/lib/c/labcomm_udp_reader_writer.c @@ -0,0 +1,105 @@ +#include <errno.h> +#include <unistd.h> +#include "labcomm.h" +#include "/home/sven/slask/UDP/udp_hack.h" + +#define BUFFER_SIZE 2048 + +int labcomm_udp_reader( + labcomm_reader_t *r, + labcomm_reader_action_t action) +{ + int result = -EINVAL; + server_context_t *ctx = r->context; + + switch (action) { + case labcomm_reader_alloc: { + r->data = malloc(BUFFER_SIZE); + if (r->data) { + r->data_size = BUFFER_SIZE; + result = r->data_size; + } else { + r->data_size = 0; + result = -ENOMEM; + } + r->count = 0; + r->pos = 0; + } break; + case labcomm_reader_start: + case labcomm_reader_continue: { + if (r->pos < r->count) { + result = r->count - r->pos; + } else { + int err; + r->pos = 0; + err=udp_recv(ctx, r->data, r->data_size); + if (err <= 0) { + r->count = 0; + result = -1; + } else { + r->count = err; + result = r->count - r->pos; + } + } + } break; + case labcomm_reader_end: { + result = 0; + } break; + case labcomm_reader_free: { + free(r->data); + r->data = 0; + r->data_size = 0; + r->count = 0; + r->pos = 0; + result = 0; + } break; + } + return result; +} + +int labcomm_udp_writer( + labcomm_writer_t *w, + labcomm_writer_action_t action) +{ + int result = 0; + //int *fd = w->context; + server_context_t *ctx = w->context; + + switch (action) { + case labcomm_writer_alloc: { + w->data = malloc(BUFFER_SIZE); + if (! w->data) { + result = -ENOMEM; + w->data_size = 0; + w->count = 0; + w->pos = 0; + } else { + w->data_size = BUFFER_SIZE; + w->count = BUFFER_SIZE; + w->pos = 0; + } + } break; + case labcomm_writer_free: { + free(w->data); + w->data = 0; + w->data_size = 0; + w->count = 0; + w->pos = 0; + } break; + case labcomm_writer_start: { + w->pos = 0; + } break; + case labcomm_writer_continue: { + result = udp_send(ctx, w->data, w->pos); + w->pos = 0; + } break; + case labcomm_writer_end: { + result = udp_send(ctx, w->data, w->pos); + w->pos = 0; + } break; + case labcomm_writer_available: { + result = w->count - w->pos; + } break; + } + return result; +} diff --git a/lib/c/labcomm_udp_reader_writer.h b/lib/c/labcomm_udp_reader_writer.h new file mode 100644 index 0000000000000000000000000000000000000000..c4a6a6bb67680da263849c1738e38f357177271d --- /dev/null +++ b/lib/c/labcomm_udp_reader_writer.h @@ -0,0 +1,9 @@ +#include "labcomm.h" + +extern int labcomm_udp_reader( + labcomm_reader_t *r, + labcomm_reader_action_t action); + +extern int labcomm_udp_writer( + labcomm_writer_t *r, + labcomm_writer_action_t action); diff --git a/lib/c/udp_hack.c b/lib/c/udp_hack.c new file mode 100644 index 0000000000000000000000000000000000000000..f4670bb3495f6d53d3544b5c70a6ed3850683e64 --- /dev/null +++ b/lib/c/udp_hack.c @@ -0,0 +1,117 @@ +#include <arpa/inet.h> +#include <netinet/in.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <unistd.h> + +#define BUFLEN 512 +#define NPACK 10 +#define PORT 9930 + +void diep(char *s) +{ + perror(s); + exit(1); +} + +typedef struct { + struct sockaddr_in si_me, si_other; + int s, i, slen; + char buf[BUFLEN]; +} server_context_t; + +server_context_t* server_init(void) +{ + server_context_t* ctx; + ctx = malloc(sizeof(server_context_t)); + if(!ctx) + diep("malloc"); + ctx->slen=sizeof(struct sockaddr_in); + if ((ctx->s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) + diep("socket"); + + memset((char *) &ctx->si_me, 0, sizeof(ctx->si_me)); + ctx->si_me.sin_family = AF_INET; + ctx->si_me.sin_port = htons(PORT); + ctx->si_me.sin_addr.s_addr = htonl(INADDR_ANY); + if (bind(ctx->s, &ctx->si_me, sizeof(ctx->si_me))==-1) + diep("bind"); + return ctx; +} + +int udp_recv(server_context_t *ctx, char *buf, int len){ + int l; + if ((l=recvfrom(ctx->s, buf, len, 0, &ctx->si_other, &ctx->slen))==-1) + diep("recvfrom()"); + return l; +// printf("Received packet from %s:%d\nData: %s\n\n", +// inet_ntoa(ctx->si_other.sin_addr), ntohs(ctx->si_other.sin_port), ctx->buf); +} + +int server_run(server_context_t *ctx){ + for (ctx->i=0; ctx->i<NPACK; ctx->i++) { + int l = udp_recv(ctx, ctx->buf, BUFLEN); + printf("Received %d bytes\n",l); + printf("Received data: %s\n", + ctx->buf); + } +} + +int server_exit(server_context_t *ctx) { + close(ctx->s); + free(ctx); + return 0; +} + +#define SRV_IP "127.0.0.1" + +server_context_t* client_init(void) +{ + + server_context_t *ctx = malloc(sizeof(server_context_t)); + if(!ctx) + diep("malloc"); + ctx->slen=sizeof(struct sockaddr_in); + + if ((ctx->s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1) + diep("socket"); + + memset((char *) &ctx->si_other, 0, sizeof(ctx->si_other)); + ctx->si_other.sin_family = AF_INET; + ctx->si_other.sin_port = htons(PORT); + if (inet_aton(SRV_IP, &ctx->si_other.sin_addr)==0) { + fprintf(stderr, "inet_aton() failed\n"); + exit(1); + } + return ctx; +} + +int udp_send(server_context_t* ctx, char *s, int len) +{ + int result; + if ( (result=sendto(ctx->s, s, len, 0, &(ctx->si_other), ctx->slen))==-1) + diep("sendto()"); + return result; +} + +int client_run(server_context_t* ctx) +{ + for (ctx->i=0; ctx->i<NPACK; ctx->i++) { + printf("Sending packet %d\n", ctx->i); +// sprintf(ctx->buf, "This is packet %d\n", ctx->i); +// udp_send(ctx); + udp_send(ctx, "Hello, world", 12); + } + return 0; +} + +int client_exit(server_context_t* ctx) +{ + + close(ctx->s); + free(ctx); + return 0; +} + diff --git a/lib/c/udp_hack.h b/lib/c/udp_hack.h new file mode 100644 index 0000000000000000000000000000000000000000..ac6c56e4923db83dddf4c992c037c4049308d441 --- /dev/null +++ b/lib/c/udp_hack.h @@ -0,0 +1,12 @@ +struct hidden; +typedef struct hidden server_context_t; + +int udp_send(server_context_t*, char*, int); +int udp_recv(server_context_t*, char*, int); +server_context_t* server_init(void); +int server_run(server_context_t *ctx); +int server_exit(server_context_t *ctx); +server_context_t* client_init(void); +//int client_run()server_context_t* ; +//int client_free(vserver_context_t*); +