У меня есть код python, который передает сообщение и принимает широковещательное сообщение с использованием UDP (SOCK_DGRAM). Исходный код python находится в этом сообщении: https://stackoverflow.com/a/17055865/260127Реализация UDP-вещания в C++
Мне нужно перевести этот код на Python в C++/C. Я googled, чтобы вручную переводить функции один за другим, чтобы получить этот код.
#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 pinger.
Что не так с этим кодом?
"Ничего не происходит" является довольно универсальным. Почему бы вам не положить пару отпечатков, чтобы изолировать проблему? Возможно, один после join(), один до recvfrom и один после. Ваш код кажется правильным, поэтому, если он все время ждет, возможно, это recvfrom, который не получает никаких данных. – Rob013