From 1ba0eb9cd04bcf600ddff05c040f7a76a26b1fd9 Mon Sep 17 00:00:00 2001 From: tkarrass Date: Sat, 2 Nov 2013 19:21:09 +0100 Subject: [PATCH] transformed callback func to use message struct instead of timestamp --- src/display.c | 4 ++-- src/display.h | 3 ++- src/msg.c | 11 ++++++++--- src/msg.h | 2 ++ src/net.c | 27 ++++++++++++++++++++++----- src/net.h | 5 ++++- 6 files changed, 40 insertions(+), 12 deletions(-) diff --git a/src/display.c b/src/display.c index 593c2a1..62e1530 100644 --- a/src/display.c +++ b/src/display.c @@ -1,6 +1,6 @@ #include "display.h" -void callback(long tst) { - printf("in callback, tst=%ld\n", tst); +void callback(const struct message *msg) { + printf("in callback, tst=%d\n", msg->timestamp); } diff --git a/src/display.h b/src/display.h index c671667..caf103b 100644 --- a/src/display.h +++ b/src/display.h @@ -2,7 +2,8 @@ #define __DISPLAY #include +#include "msg.h" -void callback(long tst); +void callback(const struct message *msg); #endif diff --git a/src/msg.c b/src/msg.c index e41a12e..70bc7fc 100644 --- a/src/msg.c +++ b/src/msg.c @@ -13,15 +13,20 @@ void serialize (char *buf, struct message *msg) { memcpy(&buf[0], &msg->timestamp, 4); memcpy(&buf[4], &msg->width, 4); memcpy(&buf[8], &msg->height, 4); - memcpy(&buf[12], msg->image, msg->width * msg->height); + if (msg->width * msg->height) + memcpy(&buf[12], msg->image, msg->width * msg->height); } void deserialize (struct message *msg, const char *buf) { memcpy(&msg->timestamp, &buf[0], 4); memcpy(&msg->width, &buf[4], 4); memcpy(&msg->height, &buf[8], 4); - msg->image = (char*) malloc(msg->width * msg->height); - memcpy(msg->image, &buf[12], msg->width * msg->height); + if (msg->width * msg->height) { + msg->image = (char*) malloc(msg->width * msg->height); + memcpy(msg->image, &buf[12], msg->width * msg->height); + } else { + msg->image = NULL; + } } /* Buffer ist nicht erforderlich diff --git a/src/msg.h b/src/msg.h index 636d466..4525cc6 100644 --- a/src/msg.h +++ b/src/msg.h @@ -1,6 +1,8 @@ #ifndef __MSG # define __MSG +#include + //typedef struct Buffer { // int size; // void *data; diff --git a/src/net.c b/src/net.c index cd7fd0d..2dd579a 100644 --- a/src/net.c +++ b/src/net.c @@ -14,9 +14,12 @@ #include // nanosleep -#include "misc.h" // prog_info -#include "display.h" // callback +#include "net.h" + +// kleiner helfer +// auch von bejee geguttenbergt +// void *get_in_addr(struct sockaddr *sa) { if (sa->sa_family == AF_INET) { @@ -26,6 +29,10 @@ void *get_in_addr(struct sockaddr *sa) return &(((struct sockaddr_in6*)sa)->sin6_addr); } + +// server mode +// pumpt im for(;;) den status ins eth +// int run_server(const struct prog_info *pinfo) { struct addrinfo hints, *servinfo, *p; int ret; @@ -59,15 +66,18 @@ int run_server(const struct prog_info *pinfo) { tim.tv_sec = 0; tim.tv_nsec = 500000000; + // Einem Socket muss das Broadcasting explizit erlaubt werden: int broadcastPermission = 1; if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, (void *) &broadcastPermission,sizeof(broadcastPermission)) < 0){ fprintf(stderr, "setsockopt error"); exit(1); } + // for (;;) { printf("sending...\n"); int numbytes; + // TODO: Hier den Messageblock erstellen und serialisieren. if ((numbytes = sendto(sockfd, "bla", 3, 0, p->ai_addr, p->ai_addrlen)) == -1) { perror("error sending"); return -44; @@ -82,7 +92,11 @@ int run_server(const struct prog_info *pinfo) { return 0; } -int run_client(const struct prog_info *pinfo, void (*framecallback)(long) ) { + +// lauschangriff: +// einfach mal in den äther horchen und alle messages rausnehmen die wo da gibt. +// +int run_client(const struct prog_info *pinfo, void (*framecallback)(const struct message *) ) { struct addrinfo hints, *servinfo; char portbuf[6]; @@ -104,7 +118,7 @@ int run_client(const struct prog_info *pinfo, void (*framecallback)(long) ) { struct addrinfo *info; int sockfd; - //char s[INET6_ADDRSTRLEN]; + // mal drin lassen: falls die ip der gegenstelle relevant werden sollte: char s[INET6_ADDRSTRLEN]; for (info = servinfo; info != NULL; info = info->ai_next) { if ((sockfd = socket(info->ai_family, info->ai_socktype, info->ai_protocol)) == -1) { perror("sock"); @@ -141,7 +155,10 @@ int run_client(const struct prog_info *pinfo, void (*framecallback)(long) ) { buf[numbytes] = '\0'; //printf("listener: packet contains \"%s\"\n", buf); - framecallback(123); + struct message *msg = (struct message *)malloc(sizeof(struct message)); + deserialize(msg, buf); + + framecallback(msg); } while (strncmp(buf, "exit", 10000)); diff --git a/src/net.h b/src/net.h index f396641..1e70d70 100644 --- a/src/net.h +++ b/src/net.h @@ -2,9 +2,12 @@ # define __NET #include // struct sockaddr +#include "misc.h" // prog_info +#include "msg.h" // message serialization +#include "display.h" // callback void *get_in_addr(struct sockaddr *sa); int run_server(const struct prog_info *pinfo); -int run_client(const struct prog_info *pinfo,void(*framecallback)(long)); +int run_client(const struct prog_info *pinfo,void(*framecallback)(const struct message *)); #endif