У меня есть широкополосный радар, который я хочу включить. Чтобы включить его, мне нужно отправить два регистра, например:
int reg0[3] = {0x00, 0xC1, 0x01};
int reg1[3] = {0x01, 0xC1, 0x01};
Основная проблема заключается в том, что мое радарное устройство работает по протоколу UDP и работает в IGMP (3-й уровень модели ISO). Я много читал об отправке UDP на этих сайтах из службы поддержки IBM:
https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.hala001/cskudp.htm
https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxbd00/setopt.htm
… И др.
Я понимаю, что он не обязан ни создавать struct ip_mreq
, ни добавлять опции с setsockopt()
, поскольку я хочу отправлять только дейтаграммы.
Я уже пытался делать такие вещи:
#define IPM struct ip_mreq
IPM mcast;
int sock_err = bind(skemit, (SA *) &emit, lemit);
mcast.imr_multiaddr.s_addr = MCAST_JOIN_GROUP;//multicastaddress
mcast.imr_interface.s_addr = add1;
setsockopt(semit, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mcast, sizeof(IPM)); //sizeof(mcast)
Это мой код:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <signal.h>
#define SAI struct sockaddr_in
#define SA struct sockaddr
int main(){
SAI emit;
uint32_t add1 = htonl(inet_addr("236.6.7.10")); //host address
unsigned short port = htons(6680); // port
memset(&emit, '\0', sizeof(emit));
emit.sin_family = AF_INET;
emit.sin_port = port;
emit.sin_addr.s_addr = add1;
socklen_t lemit = sizeof(SAI);
int skemit = socket(AF_INET, SOCK_DGRAM, 0);
if (skemit == -1){ perror("creating socket"); }
/*
* Send a message to the multicast address specified by the
* emit sockaddr structure.
*/
int reg0[3] = {0x00, 0xC1, 0x01}; //turn_on
int reg1[3] = {0x01, 0xC1, 0x01}; //turn_on
/* Send the message in reg0 and reg1 to the server */
if (sendto(skemit, reg0, sizeof(reg0), 0, (SA*)&emit, lemit) < 0){perror("sending datagram message reg0");}
if (sendto(skemit, reg1, sizeof(reg1), 0, (SA*)&emit, lemit) < 0){perror("sending datagram message reg1");}
}
Я получаю эти ошибки:
sending datagram message reg0: Network is unreachable
sending datagram message reg1: Network is unreachable
Не могли бы вы мне помочь?