首页 > 解决方案 > 创建一个不强制转换的 sockaddr

问题描述

我想创建一个sockaddr没有有趣转换的结构,因为我有一个返回sockaddr结构的函数。但我无法真正弄清楚如何将数据从 a 重新打包sockaddr_in到 a sockaddr。我正在关注本教程,它显示了像这样完成的

struct sockaddr_in myaddr;
memset((char *)&myaddr, 0, sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
myaddr.sin_port = htons(0);
bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr);

我有一个正常返回的功能sockaddr

sockaddr CreateAddress(std::string ip, uint16_t port){
    sockaddr_in address = {0};
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr(ip.c_str());
    address.sin_port = htons(port);

    // return as sockaddr instead..
    sockaddr addr = {0};
    addr.sa_len = sizeof(sockaddr);
    addr.sa_family = AF_INET;
    // how to fill in sockaddr.sa_data?
    // maybe like this?
    addr.sa_data[0] = (address.sin_port >> 8) & 0xFF;
    addr.sa_data[1] = (address.sin_port) & 0xFF;
    addr.sa_data[2] = (address.sin_addr.s_addr >> 24) & 0xFF;
    addr.sa_data[3] = (address.sin_addr.s_addr >> 16) & 0xFF;
    addr.sa_data[4] = (address.sin_addr.s_addr >> 8) & 0xFF;
    addr.sa_data[5] = (address.sin_addr.s_addr) & 0xFF;
    return addr;
}

标签: csocketsvxworks

解决方案


套接字 API 函数被构建为将 astruct sockaddr *作为参数,因为它可以接受多种套接字地址类型,即struct sockaddr_un对于 UNIX 域套接字、struct sockaddr_in对于 IPv4、struct sockaddr_in6对于 IPv6 等。struct sockaddr类型是套接字 API(用 C 编写)的方式实现继承。

因此,这些函数实际上并不期望struct sockaddr *参数实际上指向该类型的结构。根据套接字类型,它将在内部将其转换为正确的类型。

这意味着您应该使用struct sockaddr_in而不是将struct sockaddr这些结构的地址转换为struct sockaddr *与套接字函数交互的任何时间。这是使用这些功能的预期方式。


推荐阅读