【问题标题】:Sending private UDP message in broadcast socket在广播套接字中发送私有 UDP 消息
【发布时间】:2021-07-09 06:37:57
【问题描述】:

我有一个广播频道,人们在 UDP 中谈论它并且它工作但是我有时想发送私人消息,但我的套接字处于广播模式?我有我想私下联系的人的 IP。创建一个新的套接字非常烦人,所以我想有一种方法可以用良好的 Ipaddress 发送消息,但不能在广播中发送。

struct addrinfo *res = nullptr, *it;
  struct addrinfo hints;

  memset(&hints, 0, sizeof(struct addrinfo));
  hints.ai_family = AF_INET;
  hints.ai_socktype = SOCK_DGRAM;

  getaddrinfo(ip_address.c_str(), port.c_str(), &hints, &res);

  for (it = res; it != NULL; it = it->ai_next) {
    socket_ = socket(it->ai_family, it->ai_socktype, it->ai_protocol);

    sockaddr_ = it->ai_addr;
    socklen_ = it->ai_addrlen;

    break;
  }


  int enable = 1;

  setsockopt(socket_, SOL_SOCKET, SO_BROADCAST, &enable, sizeof(int));

然后发送我的广播消息我这样做

sendto(socket_, message, len, 0, sockaddr_, socklen_);

那么我应该更改 sockaddr 吗?请帮助我:)

[编辑] 目前我决定用我想要通话 + 端口的人的 Ipadress 创建一个新套接字,但它非常“重”并且根本没有优化(我认为)

【问题讨论】:

  • 您是否尝试使用不是广播地址的地址发送到?
  • @user253751 所以我应该改变我的结构 sockaddr_?问题是结构是 :struct sockaddr { u_short sa_family;字符 sa_data[14]; };
  • sendto 的一个参数告诉它要发送到哪个地址,对吧?并且您正在发送到广播地址?你想发送到不同的地址?更改该参数

标签: c++ c sockets udp


【解决方案1】:

sendto 的参数告诉它要发送到哪个地址以及您要发送到广播地址。

如果在连接模式(SOCK_STREAM,SOCK_SEQPACKET)套接字上使用 sendto(),则忽略参数 dest_addr 和 addrlen(并且当它们不是 NULL 和 0 时可能返回错误 EISCONN),错误 ENOTCONN 是当套接字实际未连接时返回。否则,目标地址由 dest_addr 给出,addrlen 指定其大小。对于 sendmsg(),目标的地址由 msg.msg_name 给出,msg.msg_namelen 指定其大小。

【讨论】:

    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2012-06-23
    • 2012-09-17
    • 2021-07-26
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多