如何将 4 个字节复制到 sockaddr.sa_data?

Gue*_*OCs 3 c c++ sockets networking

根据/sf/answers/372973331/,我可以使用

std::string ip ="192.168.1.54";
std::stringstream s(ip);
int a,b,c,d; //to store the 4 ints
char ch; //to temporarily store the '.'
s >> a >> ch >> b >> ch >> c >> ch >> d;
std::cout << a << "  " << b << "  " << c << "  "<< d;
Run Code Online (Sandbox Code Playgroud)

将 IP 转换为其 4 个字节。Buw 我怎么把它们放在一个

struct sockaddr
  {
    __SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  */
    char sa_data[14];       /* Address data.  */
  };
Run Code Online (Sandbox Code Playgroud)

?

我应该简单地复制前 4 个字节中的 4 个字节sa_data吗?

dbu*_*ush 7

你实际上并没有struct sockaddr直接使用 a 。相反,您可以填充 astruct sockaddr_in以保存 IPv4 地址和端口,然后将该结构的地址传递给需要struct sockaddr *.

要从sockaddr_inC 字符串填充 a 的地址字段,您可以使用inet_addr.

例如:

struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(ip.c_str());
sin.sin_port = 0;
Run Code Online (Sandbox Code Playgroud)

调用时recvfromaddrlen参数应该是一个指向变量的指针,该变量设置为src_addr参数指向的结构的大小。例如:

struct sockaddr_in peerAddr;
socklen_t len = sizeof(peerAddr);
recvfrom(sock, data, capacity, 0, (struct sockaddr *)&peerAddr, &len);
Run Code Online (Sandbox Code Playgroud)


zwo*_*wol 5

一个更好的方法是使用getaddrinfo,比如

struct addrinfo params = { 0 };
params.ai_flags = AI_NUMERICHOST | AI_NUMERICSERV; // adjust
params.ai_family = AF_UNSPEC;
params.ai_socktype = SOCK_STREAM; // adjust
params.ai_protocol = IPPROTO_TCP; // adjust

struct addrinfo *addrs;
int status = getaddrinfo(ip.c_str(), port.c_str(), &params, &addrs);
if (status == EAI_SYSTEM) {
  fprintf(stderr, "%s:%s: %s\n", ip.c_str(), port.c_str(), strerror(errno));
  return -1;
} else if (status) {
  fprintf(stderr, "%s:%s: %s\n", ip.c_str(), port.c_str(), gai_strerror(status));
  return -1;
}
for (struct addrinfo *ai = addrs; ai; ai = ai->ai_next) {
  // do something with ai->ai_addr etc here
}
freeaddrinfo(addrs);
return 0;
Run Code Online (Sandbox Code Playgroud)

您需要为您的应用程序调整标记为“调整”的行。您还需要提供一个端口号(不方便的是,它把它作为一个string,因为它也可以接受一个协议名称)。

这样做的优点是:addrs链表中的每个条目都包含创建套接字并将其连接到该地址所需的所有数据;它为您无缝处理 IPv6;而且,如果您去掉AI_NUMERICHOST,它也可以无缝地为您处理域名