very similar ethernet driver, so it shouldn’t really matter.
void multicast_test1(unsigned long thread_input)
{
struct ip_mreq stMreq;
int s;
int result;
int i;
int size, len;
int buffsize = BUFSIZE;
int one;
char iTmp;
struct ip_mreq mreq; // Used in adding or dropping // multicasting addresses
struct sockaddr_in local_sin, // Local socket's address
dest_sin, recv_sin, // Holds the source address upon
stFrom; // recvfrom function returns
one = 1;
printf("---- OPEN ----
");
/* get a datagram socket */
s = socket(AF_INET,SOCK_DGRAM,0);
if (s == -1)
{
error("SOCKET creation error");
}
/*
Bind a receive port to the socket
*/
memset(&local_sin, 0, sizeof(local_sin));
local_sin.sin_family = AF_INET;
local_sin.sin_port = htons(10000);
local_sin.sin_addr.s_addr = htonl(INADDR_ANY);
result = bind (s, &local_sin, sizeof (local_sin));
if (result == -1)
{
error("BIND error");
}
#if 1
one = 1;
result = setsockopt(s, SOL_SOCKET, SO_REUSEPORT, (char *)&one, sizeof one);
if (result == -1)
{
error(“SETSOCKOPT error”);
}
#endif
result = setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&buffsize, sizeof(buffsize));
if (result == -1)
{
error("SETSOCKOPT error");
}
result = setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *)&buffsize, sizeof(buffsize));
if (result == -1)
{
error("SETSOCKOPT error");
}
printf("---- JOIN ----
");
/* join the first multicast group. 224.1.2.4 */
mreq.imr_multiaddr.s_addr = NAInet_addr("224.1.2.4");
mreq.imr_interface.s_addr = INADDR_ANY;
result = setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq));
if (result != 0)
{
error("setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq))");
}
printf("---- TTL ----
");
/* set TTL to traverse up to multiple routers */
iTmp = 1;
result = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&iTmp, sizeof(iTmp));
if (result != 0)
{
error(“setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&iTmp, sizeof(iTmp))”);
}
printf("---- LOOPBACK ----
");
/* disable loopback */
iTmp = 0;
result = setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&iTmp, sizeof(iTmp));
if (result != 0)
{
error(“setsockopt(s, SOL_SOCKET, IP_MULTICAST_LOOP, (char *)&iTmp, sizeof(iTmp))”);
}
/* receiving message */
for (i = 0; i < 0xffffffff; i++)
{
len = sizeof(stFrom);
result = recvfrom(s, achIn, BUFSIZE, 0, (struct sockaddr_in*)&stFrom, &len);
printf("%d: multicast_test1 receive data length %d from 0x%X
", i+1, result, (unsigned)stFrom.sin_addr.s_addr);
if (result == -1)
{
error("recvfrom()");
}
}
printf("
");
printf("---- DELETE ----
");
/* delete the multicast group. */
mreq.imr_multiaddr.s_addr = NAInet_addr(“224.1.2.4”);
result = setsockopt(s, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&mreq, sizeof(mreq));
if (result != 0)
{
error("setsockopt(s, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char *)&mreq, sizeof(mreq))");
}
printf("---- TTL ----
");
/* set TTL to traverse up to multiple routers */
iTmp = 1;
result = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&iTmp, sizeof(iTmp));
if (result != 0)
{
error("setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&iTmp, sizeof(iTmp))");
}
printf("---- LOOPBACK ----
");
/* disable loopback */
iTmp = 0;
result = setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&iTmp, sizeof(iTmp));
if (result != 0)
{
error("setsockopt(s, SOL_SOCKET, IP_MULTICAST_LOOP, (char *)&iTmp, sizeof(iTmp))");
}
socketclose(s);
printf("---- FIN ----
");
{
}
}