对于一个项目,我需要每秒发送一次UDP广播到87.255.255.255和端口4448与我的项目的值。我已经writen在C++中的一些代码,但我得到总是错误:C++发送UDP广播
断言`::绑定(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()'中通常是一个坏主意,因为在调试关闭时它们将被删除。而不是_asserting_调用'perror()',这样你就可以看到它失败的原因。 –
我尝试将其更改为perror,但我得到了错误:无法将'bool'转换为'const char *'作为参数'1'到'void perror(const char *)' – josejos41
if(bind(...) <0)perror(“bind()”);'而不是'assert(bind(...)!= - 1);' –