首页 > 解决方案 > 如何将 4 个字节复制到 sockaddr.sa_data?

问题描述

根据https://stackoverflow.com/a/5328190,我可以使用

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;

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

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

?

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

标签: c++csocketsnetworking

解决方案


您实际上并没有struct sockaddr直接使用 a 。您将改为填充struct sockaddr_in用于保存 IPv4 地址和端口的 a,然后将该结构的地址传递给期望 a 的函数struct sockaddr *

sockaddr_in要从C 字符串填充 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;

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

struct sockaddr_in peerAddr;
socklen_t len = sizeof(peerAddr);
recvfrom(sock, data, capacity, 0, (struct sockaddr *)&peerAddr, &len);

推荐阅读