簡體   English   中英

如何發送UDP數據報到IGMP設備?

[英]How to send an UDP datagram to an IGMP device?

我有一個想打開的寬帶雷達。 要打開它,我必須發送兩個寄存器,如下所示:

    int reg0[3] = {0x00, 0xC1, 0x01};      
    int reg1[3] = {0x01, 0xC1, 0x01};

主要問題是我的Radar設備正在使用UDP協議,並且可以在IGMP(ISO模型的第三層)中使用。 我已經在IBM支持機構的這些站點上閱讀了很多有關UDP發送的信息: https : //www.ibm.com/support/knowledgecenter/zh-CN/SSLTBW_2.3.0/com.ibm.zos.v2r3.hala001/cskudp.htm https ://www.ibm.com/support/knowledgecenter/zh-CN/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxbd00/setopt.htm…等。

我不知道它既struct ip_mreq創建struct ip_mreqstruct 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

你可以幫幫我嗎?

我的問題已經解決,這就是為什么我要部分回答的原因:我設法在python中建立連接。 不能是計算機設置的問題。

這是有效的代碼:

import socket
import struct

MCAST_GRP = '236.6.7.8'
MCAST_PORT = 6678

HOST2 = '236.6.7.10'
PORT2 = 6680

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)



sock.bind(('', MCAST_PORT))  # use MCAST_GRP instead of '' to listen only
                         # to MCAST_GRP, not all groups on MCAST_PORT


mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)

sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

sock2 = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

reg0=bytes([0x00, 0xC1, 0x01])               #turn_on
reg1=bytes([0x01, 0xC1, 0x01])               #turn_on


sock2.sendto(reg0, (HOST2, PORT2))
sock2.sendto(reg1, (HOST2, PORT2))
sock2.sendto(reg3, (HOST2, PORT2))
pcapfile = open('ragar.txt', 'w')
while True:
  pcapfile.write(str(sock.recv(65536)))
pcapfile.close()
print('the end')

sock2設法將寄存器發送到設備,而sock則正確接收數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM