UDP Multicast messaging library
See full example in example.c
#include <stdbool.h>
#include <stdint.h>
MUTALK_MAX_NAME_SIZE 1024
typedef struct mutalk_group_t {
struct mutalk_group_t *next, *prev; // References to nearby groups
char *name; // Group name.
size_t name_size; // Group name size in bytes
int fd; // Socket descriptor
} mutalk_group_t;
typedef struct mutalk_msg_t {
bool error; // Error(also timeout) flag
ssize_t count; // Bytes written to buffer
mutalk_group_t *stream; // Reference to group definition
struct in_addr source_ip; // Sender IP
uint16_t source_port; // Sender port
} mutalk_msg_t;
typedef struct mutalk_t {
size_t cache_size; // Size of allocated buffer for incoming messages
int epoll_fd; // EPOLL descriptor
int sender_fd; // Socket descriptor, used for outgoing messages
struct mutalk_group_t *groups; // Reference to first group definition. May be NULL
char *cache_data; // Buffer for incoming messages
char cache_name[MUTALK_MAX_NAME_SIZE]; // Buffer for name in incoming messages
} mutalk_t;
mutref
-struct mutalk_t*
mutref mutalk_create(size_t buffer_size)
Create new instance of MUTalk engine.
Returns NULL if something wrong (see errno message) or instance of MUTalk.
Use mutalk_destory
for cleaning memory.
size_t buffer_size
Maximum size of incoming messages
This function is thread-safe.
Example:
#include "mutalk.h"
int main() {
mutref talk = mutalk_create(65535);
//... Do something
mutalk_destroy(talk);
return 0;
}
void mutalk_destroy(mutref talk)
Close all sockets and EPoll. Free all allocated memory
mutref talk
MUTalk instance ref
This function is NOT thread-safe for one MUTalk instance.
Example: see mutalk_create
bool mutalk_group_add(mutref talk, const char* name)
Join to MUTalk group. Do nothing if group already joined.
Returns true
if joined to group, otherwise false (also if already joined to group)
mutref talk
MUTalk instance refconst char* name
Group name. Maximum lenght defined in MUTALK_MAX_NAME_SIZE. Name can't has spaces
This function is NOT thread-safe for one MUTalk instance
Example:
// See initialization in mutalk_create example
const char *groupName = "some.test.group\0";
if(mutalk_group_add(talk, groupName))
printf("Listening group %s\n", groupName);
else
fprintf(stderr, "Failed listen group %s\n", groupName);
void mutalk_group_remove(mutref talk, const char* name)
Leave MUTalk group. Do nothing if group not joined
mutref talk
MUTalk instance refconst char* name
Group name. Maximum lenght defined in MUTALK_MAX_NAME_SIZE. Name can't has spaces
This function is NOT thread-safe for one MUTalk instance
void mutalk_send(mutref talk, const char *subject,const char * data, size_t size)
Send message to group.
Important! Big messages (more then MTU size) may be corrupted (it depends of your network configuration).
mutref talk
MUTalk instance refconst char* name
Group name. Maximum lenght defined in MUTALK_MAX_NAME_SIZE. Name can't has spacesconst char* data
Any datasize_t size
Size of data.
This function is thread-safe
Example:
// See initialization in mutalk_create example
const char *message = "Hello World!\0";
const char *groupName = "some.test.group\0";
mutalk_send(talk, groupName, message, strlen(message));
mutalk_msg_t mutalk_wait(
mutref talk,
void *buffer,
size_t buf_size,
int32_t timeout_ms)
Wait message from any joined groups. Returns mutalk_msg_t instance.
mutref talk
MUTalk instance refvoid* buffer
Destination buffer.size_t buf_size
Destination buffer sizeint32_t timeout_ms
Timeout in milliseconds. Set -1 for infinity. If no messages received till timeout raised,msg.error=true
will be set
This function is NOT thread-safe for one MUTalk instance
Example:
// See initialization in mutalk_create example
const size_t contentSize = 65535;
mutalk_msg_t msg;
char content[contentSize];
while (!(msg = mutalk_wait(talk, content, contentSize, -1)).error) {
content[msg.count] = '\0';
printf("[%s:%u](%s)<%li bytes> %s\n",
inet_ntoa(msg.source_ip),
msg.source_port,
msg.stream->name,
msg.count,
content);
}