我需要一个项目每秒向87.255.255.255和端口4448发送UDP广播,并携带我的项目值。 我已经用C++编写了一些代码,但总是出现错误:
断言“ ::bind(s,(sockaddr *)&si_me,sizeof(sockaddr))!= -1”失败
出错的代码为:
//assert(::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1);
当我删除这行代码后,程序运行了,但是我在wireshark中没有发现任何东西。
有没有人有解决方案或者一些额外的信息来构建广播发送器?
#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);
}
}
assert()
是一个不好的主意,因为当调试关闭时,它们将被删除。取而代之的是,调用perror()
来查看失败的原因。 - Johnny Cage