Skip to content

Instantly share code, notes, and snippets.

@smarthall
Created August 12, 2015 12:11
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save smarthall/875301eb5a6b35378aec to your computer and use it in GitHub Desktop.
Save smarthall/875301eb5a6b35378aec to your computer and use it in GitHub Desktop.
LIFX Packet Sending Example
#include "lifx.h"
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
int sockaddr_len;
int status;
struct sockaddr_in listen_addr, broadcast_addr, recv_addr;
lifx_header header;
sockaddr_len = sizeof(struct sockaddr_in);
memset(&listen_addr, 0, sockaddr_len);
memset(&broadcast_addr, 0, sockaddr_len);
memset(&recv_addr, 0, sockaddr_len);
int client_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
listen_addr.sin_addr.s_addr = htonl(INADDR_ANY);
listen_addr.sin_port = htons(0);
listen_addr.sin_family = AF_INET;
status = bind(client_socket, (struct sockaddr*)&listen_addr, sockaddr_len);
printf("Client Bind Status: %d\n", status);
int yes = 1;
status = setsockopt(client_socket, SOL_SOCKET, SO_BROADCAST, (const char*)&yes, sizeof(int));
printf("Setsockopt Status: %d\n", status);
// Send a packet
broadcast_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); // broadcast
broadcast_addr.sin_port = htons(56700);
broadcast_addr.sin_family = AF_INET;
memset(&header, 0, sizeof(lifx_header));
header.size = sizeof(lifx_header);
header.origin = 0;
header.tagged = 1;
header.addressable = 1;
header.protocol = 1024;
header.source = 123;
header.target[0] = 0;
header.target[1] = 0;
header.target[2] = 0;
header.target[3] = 0;
header.target[4] = 0;
header.target[5] = 0;
header.target[6] = 0;
header.target[7] = 0;
header.ack_required = 0;
header.res_required = 1;
header.sequence = 100;
header.type = 2; // GetService
status = sendto(client_socket, (const char*)&header, sizeof(lifx_header), 0, (struct sockaddr*)&broadcast_addr, sockaddr_len);
printf("Client Sendto Status: %d\n", status);
// Receive a packet - should be the broadcast message
lifx_header recv_header;
status = recvfrom(client_socket, (char*)&recv_header, sizeof(lifx_header), 0, (struct sockaddr*)&recv_addr, (int*)(&sockaddr_len));
printf("Server recvfrom: %d\n", status);
if (status > 0)
{
printf("Received message of type %d\n", recv_header.type);
printf("Sequence is %d\n", recv_header.sequence);
}
close(client_socket);
return 0;
}
#pragma once
#include <stdint.h>
#pragma pack(push, 1)
typedef struct {
/* frame */
uint16_t size;
uint16_t protocol:12;
uint8_t addressable:1;
uint8_t tagged:1;
uint8_t origin:2;
uint32_t source;
/* frame address */
uint8_t target[8];
uint8_t reserved[6];
uint8_t res_required:1;
uint8_t ack_required:1;
uint8_t :6;
uint8_t sequence;
/* protocol header */
uint64_t :64;
uint16_t type;
uint16_t :16;
/* variable length payload follows */
} lifx_header;
#pragma pack(pop)
@smarthall
Copy link
Author

Compile with:

gcc lifx.c -o lifx

Run with:

./lifx

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment