User Tools

Site Tools


Sidebar

Dan's Wiki

DokuWiki Instructions (local) DokuWiki Manual
Site Checker (Orphans Wanted)

Edit Sidebar

projects:a4sim:raspberrypi:listenforudpexample

Listen For UDP Example, from X-Plane Plugin

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
 
#define SIZE 512
#define MY_PORT 49200
 
#define DEST_PORT 49000
#define DEST_IP "192.168.0.12"
 
#define MAXLINE 1024
#define MAX_DREFS 80
 
void diep(char *s)
{
    perror(s);
    exit(1);
}
 
void print_hex_memory(void *mem) {
  int i;
  unsigned char *p = (unsigned char *)mem;
  for (i=0;i<64;i++) {
    printf("0x%02x ", p[i]);
    if ((i%16==0) && i)
      printf("\n");
  }
  printf("\n");
}
 
typedef int xint;
typedef char xchr;
typedef float xflt;
 
struct dref_struct_in 
{
	xchr prefix5[4];
	xint dref_freq			;
	xint dref_en			;
	xchr dref_string[400]	;
};
 
void stroverlay(xchr * dest, char * source) {
	for (int i=0;i < 1000;i++) {
		if (source[i] != 0) {
			dest[i] = source[i];
		} else {
			break;
		}
	}
}
 
struct dref_struct_in drefs [MAX_DREFS];
float drefValues [MAX_DREFS];
int drefCount = 0;
char buf[SIZE];
 
 
int receiveFromXPlane() {
	setbuf(stdout, NULL);
	int s = 0;
	printf("Begin create socket to receive from XPlane.\n");
 
	struct sockaddr_in srcaddr;
 
	if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
	{
		printf("Failed to create socket\n\n" );
		return -1;
	}
 
// Zero out the srcaddr struct contents
    memset(&srcaddr, 0, sizeof(srcaddr)); 
 
    // Filling source information 
    srcaddr.sin_family = AF_INET; 
    srcaddr.sin_port = htons(MY_PORT);
    srcaddr.sin_addr.s_addr = htonl(INADDR_ANY); 
 
  	if (bind(s, (struct sockaddr *)&srcaddr, sizeof(srcaddr))==-1) {
		printf("bind failed.\n\n" );
		exit(-2);
	}
 
		printf("Begin listening for Two Floats on port %i.\n",MY_PORT);
 
	    printf("sin_port ntohs: %u\n",ntohs(srcaddr.sin_port));
 
 
	for (int i=0; i<4; i++) {
		int receivedByteCount = 0;
		if ((receivedByteCount = recvfrom(s, buf, SIZE, 0, NULL, NULL))==-1) {
			diep("recvfrom()");
		}
		printf("\n\nReceived Data: %s size: %i\n",  buf, receivedByteCount);
 
		/*for (int j=0;j < drefCount;j++) {
			int indexEn = *(int *)(((void *)&buf) + 5 + (8 * j));
			drefValues[j] = *(float *)(((void *)&buf) + 5 + 4 + (8 * j));
			printf("\nDref: %s: %i %f",drefs[j].dref_string, indexEn, (double)drefValues[j]);
		}
		for (int j=0;j < drefCount;j++) {
			float look = *(float *)(((void *)&buf) + 4 + (4 * j));
			printf("\nDref: %f",look);
		}*/
		float * recFloatPtr = (float *) &buf;
 
		for (int i = 0;i < receivedByteCount / 4;i++) {
			printf("\n\nReceived float %i: %f\n", i, *recFloatPtr);
			recFloatPtr++;
		}
	    print_hex_memory(buf);
 
 
	}
 
	printf("Done receiving UDP.");
 
	close(s);
	return 0;
}
 
int main(int argc, char *argv[]) 
{
	return receiveFromXPlane();
}
projects/a4sim/raspberrypi/listenforudpexample.txt · Last modified: 2019/09/25 02:09 by dwheele