メッセージをブロードキャストし、UDP (SOCK_DGRAM) を使用してブロードキャストされたメッセージを受信する Python コードがあります。Python のソース コードは次の投稿にあります: https://stackoverflow.com/a/17055865/260127
この Python コードを C++/C に変換する必要があります。このコードを取得するために、Google で関数を 1 つずつ手動で翻訳しました。
#include <iostream>
#include <memory>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <thread>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
// https://stackoverflow.com/questions/13898207/recvfrom-bad-address-sendto-address-family-not-supported-by-protocol
// http://linux.die.net/man/3/setsockopt
void pinger(string msg)
{
cout << "pinger spawned: " << msg;
int bytes_sent;
char data_sent[256] = "This is a test";
struct sockaddr_in to;
int addrlen;
int s = socket(AF_INET, SOCK_DGRAM, 0);
memset(&to, 0, sizeof(to));
to.sin_family = AF_INET;
to.sin_addr.s_addr = inet_addr("192.168.65.255");
to.sin_port = htons(4499);
int optval = 1;
socklen_t optlen;
getsockopt(s, SOL_SOCKET, SO_BROADCAST, &optval, &optlen);
getsockopt(s, SOL_SOCKET, SO_REUSEADDR, &optval, &optlen);
if (optval != 0) {
cout << "SO_BROADCAST enabled on s!\n";
}
sleep(0.1);
bytes_sent = sendto(s, data_sent, sizeof(data_sent), 0,
(struct sockaddr*)&to, sizeof(to));
}
int main(int argc, char *argv[])
{
thread pingerThread(pinger, "Message");
pingerThread.join();
// get the message
int bytes_received;
char data_received[256];
struct sockaddr_in from;
memset(&from, 0, sizeof(from));
from.sin_family = AF_INET;
from.sin_addr.s_addr = inet_addr("192.168.65.255");
from.sin_port = htons(4499);
int s = socket(AF_INET, SOCK_DGRAM, 0);
if(s == -1)
perror("socket");
if (bind(s, (struct sockaddr*)&from, sizeof(from)) == -1)
{
perror("Bind error");
}
socklen_t len = sizeof from;
if(recvfrom(s, data_received, 256, 0, (struct sockaddr*)&from, &len)==-1)
perror("recvfrom");
if(close(s) == -1)
perror("close");
}
コンパイルにエラーはありませんが、コードを実行すると、永遠に待機しているようです。ピンガーの cout メッセージを取得できません。
このコードの何が問題になっていますか?