對於一個項目,我需要每秒發送一次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);' –