Reputation: 35
For a project i need to send a UDP broadcast every second to 87.255.255.255 and port 4448 with the values of my project. I have writen some code in c++ but i got always the error:
Assertion `::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1' failed
with this line:
//assert(::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1);
When i delete this line the code runs but i find nothing on wireshark.
Does anyone have a solution or some extra info to build a broadcast sender?
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <assert.h>
#include <string.h>
#include <ctime>
int main(int argc, char const *argv[]) {
sockaddr_in si_me, si_other;
int s;
printf("Making socket\n");
assert((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))!=-1);
fprintf(stderr,"usage %s hostname port\n", argv[0]);
int port=4448;
int broadcast=1;
setsockopt(s, SOL_SOCKET, SO_BROADCAST,
&broadcast, sizeof broadcast);
memset(&si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(port);
si_me.sin_addr.s_addr = INADDR_ANY;
assert(::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1);
while(1)
{
printf("Send message to broadcast\n");
char buf[10000];
strcpy(buf, "test for wireshark");
unsigned slen=sizeof(sockaddr);
send(s, buf, sizeof(buf)-1, 0);
//recvfrom(s, buf, sizeof(buf)-1, 0, (sockaddr *)&si_other, &slen);
printf("recv: %s\n", buf);
sleep(1);
}
}
Upvotes: 3
Views: 20918
Reputation: 528
Apparently there's some weirdness with broadcasting under UNIX. So this may or may not work as expected.
void errno_abort(const char* header)
{
perror(header);
exit(EXIT_FAILURE);
}
int main(int argc, char* argv[])
{
#define SERVERPORT 4567
struct sockaddr_in send_addr, recv_addr;
int trueflag = 1, count = 0;
int fd;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
errno_abort("socket");
#ifndef RECV_ONLY
if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST,
&trueflag, sizeof trueflag) < 0)
errno_abort("setsockopt");
memset(&send_addr, 0, sizeof send_addr);
send_addr.sin_family = AF_INET;
send_addr.sin_port = (in_port_t) htons(SERVERPORT);
// broadcasting address for unix (?)
inet_aton("127.255.255.255", &send_addr.sin_addr);
// send_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
#endif // ! RECV_ONLY
#ifndef SEND_ONLY
if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
&trueflag, sizeof trueflag) < 0)
errno_abort("setsockopt");
memset(&recv_addr, 0, sizeof recv_addr);
recv_addr.sin_family = AF_INET;
recv_addr.sin_port = (in_port_t) htons(SERVERPORT);
recv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(fd, (struct sockaddr*) &recv_addr, sizeof recv_addr) < 0)
errno_abort("bind");
#endif // ! SEND_ONLY
while ( 1 ) {
#ifndef RECV_ONLY
char sbuf[256] = {};
snprintf(sbuf, sizeof(sbuf), "Hello(%d)!", count++);
if (sendto(fd, sbuf, strlen(sbuf)+1, 0,
(struct sockaddr*) &send_addr, sizeof send_addr) < 0)
errno_abort("send");
printf("send: %s\n", sbuf);
usleep(1000000/2);
#endif // ! RECV_ONLY
#ifndef SEND_ONLY
char rbuf[256] = {};
if (recv(fd, rbuf, sizeof(rbuf)-1, 0) < 0)
errno_abort("recv");
printf("recv: %s\n", rbuf);
#endif // ! SEND_ONLY
}
close(fd);
return 0;
}
Hope this helps. Good luck.
Upvotes: 4
Reputation: 6329
Sending a UDP packet with size 10000 is probably a bad idea. Try using strlen(buffer) instead when calling send(). This might be a reason why you don't see anything on shark.
To find a reason why bind() fails, you need to eval errno.
BTW: I remember one TCP stack implementation, which did not like IPPROTO_UDP as third parameter to the socket() call even though it is supposed to work according to the standard. Try using 0 instead.
Upvotes: 0