在广播套接字中发送私有UDP消息

3

我有一个使用UDP进行通信的广播频道,它可以正常工作。但是有时候我想发送私人消息,而我的套接字处于广播模式下。我知道那些我想私聊的人的IP地址,因此我想知道是否有一种方式可以使用正确的IP地址而不是广播方式来发送消息,而且最好不用创建一个新的套接字。

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吗? 请帮帮我 :)

[编辑] 目前我决定使用我想要交谈的人的IP地址+端口创建一个新的socket,但这非常“沉重”,而且根本没有优化(我认为)。


你是否尝试使用非广播地址发送sendto? - user253751
@user253751 那我应该在我的结构体 sockaddr_ 中进行更改。问题是这个结构体是这样的:struct sockaddr { u_short sa_family; char sa_data[14]; }; - et11enne
1
sendto函数的其中一个参数是告诉它要发送到哪个地址,对吗?而你正在发送到广播地址?你想发送到另一个地址?那就改变那个参数。 - user253751
1个回答

1

sendto()的参数告诉它要发送到哪个地址,你正在发送到广播地址。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接