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

标签 c++ c sockets networking

根据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.  */
  };
?
我应该只是简单地复制 sa_data 的前 4 个字节中的 4 个字节吗? ?

最佳答案

您实际上并没有使用 struct sockaddr直接地。您将改为填充 struct sockaddr_in它用于保存 IPv4 地址和端口,然后将该结构的地址传递给需要 struct sockaddr * 的函数。 .
填充 sockaddr_in 的地址字段从 C 字符串,你可以使用 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);

关于c++ - 如何将 4 个字节复制到 sockaddr.sa_data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63200170/

相关文章:

java - Server Socket写的时候,是不是等到Client Socket读了?

java - BufferedReader readLine() block

c++ - 如何在 C++ 中创建散列的散列?

c++ - 在 C++ 中调用 fortran 子例程时出现段错误

java - 如何限制 C++ 或 JAVA 中类的实例数?

c - 在函数中返回静态数组

c++ - 递增字符串中的单个字符

c - 使用指向指针的指针实现堆栈

c - 共享对象文件中标记为 RWE 的程序头

java - 如何将多播范围明确限制为仅 1 跳?