#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#define usleep(x) Sleep(x / 1000)
#else
#include <unistd.h>
#endif
#include "srt.h"
struct
{
const char* name;
int gtype;
} group_types [] = {
{
"broadcast", SRT_GTYPE_BROADCAST
}
};
#define SIZE(array) (sizeof array/sizeof(array[0]))
int main(int argc, char** argv)
{
int ss, st;
struct sockaddr_in sa;
const char message [] = "This message should be sent to the other side";
if (argc < 3)
{
fprintf(stderr, "Usage: %s <type> {<host> <port>}... \n", argv[0]);
return 1;
}
int gtype = SRT_GTYPE_BROADCAST;
size_t i;
for (i = 0; i < SIZE(group_types); ++i)
if (0 == strcmp(group_types[i].name, argv[1]))
{
gtype = group_types[i].gtype;
break;
}
printf("srt startup\n");
srt_startup();
size_t nmemb = argc - 2;
if (nmemb % 2)
{
fprintf(stderr, "Usage error: after <type>, <host> <port> pairs are expected.\n");
return 1;
}
nmemb /= 2;
SRT_SOCKGROUPCONFIG* grpconfig = calloc(nmemb, sizeof (SRT_SOCKGROUPCONFIG));
printf("srt group\n");
ss = srt_create_group(gtype);
if (ss == SRT_ERROR)
{
fprintf(stderr, "srt_create_group: %s\n", srt_getlasterror_str());
return 1;
}
const int B = 2;
for (i = 0; i < nmemb; ++i)
{
printf("srt remote address #%zi\n", i);
sa.sin_family = AF_INET;
sa.sin_port = htons(atoi(argv[B + 2*i + 1]));
if (inet_pton(AF_INET, argv[B + 2*i], &sa.sin_addr) != 1)
{
return 1;
}
grpconfig[i] = srt_prepare_endpoint(NULL, (struct sockaddr*)&sa, sizeof sa);
}
printf("srt connect (group)\n");
st = srt_connect_group(ss, grpconfig, nmemb);
if (st == SRT_ERROR)
{
fprintf(stderr, "srt_connect: %s\n", srt_getlasterror_str());
return 1;
}
printf("sleeping 1s to make it probable all links are established\n");
sleep(1);
SRT_SOCKGROUPDATA* grpdata = calloc(nmemb, sizeof (SRT_SOCKGROUPDATA));
for (i = 0; i < 100; i++)
{
printf("srt sendmsg2 #%zd >> %s\n",i,message);
SRT_MSGCTRL mc = srt_msgctrl_default;
mc.grpdata = grpdata;
mc.grpdata_size = nmemb;
st = srt_sendmsg2(ss, message, sizeof message, &mc);
if (st == SRT_ERROR)
{
fprintf(stderr, "srt_sendmsg: %s\n", srt_getlasterror_str());
return 1;
}
printf(" ++ Group status [%zi]:", mc.grpdata_size);
if (!mc.grpdata)
{
printf(" (ERROR: array too small!)\n");
}
else
{
for (i = 0; i < mc.grpdata_size; ++i)
{
printf( "[%zd] result=%d state=%s ", i, mc.grpdata[i].result,
mc.grpdata[i].sockstate <= SRTS_CONNECTING ? "pending" :
mc.grpdata[i].sockstate == SRTS_CONNECTED ? "connected" : "broken");
}
printf("\n");
}
usleep(1000); }
printf("srt close\n");
st = srt_close(ss);
if (st == SRT_ERROR)
{
fprintf(stderr, "srt_close: %s\n", srt_getlasterror_str());
return 1;
}
free(grpdata);
free(grpconfig);
printf("srt cleanup\n");
srt_cleanup();
return 0;
}