不使用强制转换创建sockaddr

不使用强制转换创建sockaddr,c,sockets,vxworks,C,Sockets,Vxworks,我想创建一个sockaddrstruct而不使用有趣的强制转换,因为我有一个返回sockaddrstructs的函数。但是我真的不知道如何将sockaddr\u中的数据重新打包到sockaddr。我在下面展示了这样做 struct sockaddr_in myaddr; memset((char *)&myaddr, 0, sizeof(myaddr)); myaddr.sin_family = AF_INET; myaddr.sin_addr.s_addr = htonl(INADDR

我想创建一个
sockaddr
struct而不使用有趣的强制转换,因为我有一个返回
sockaddr
structs的函数。但是我真的不知道如何将
sockaddr\u中的数据重新打包到
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;
}

socket API函数是以
struct sockaddr*
作为参数构建的,因为它可以接受多种套接字地址类型,即UNIX域套接字的
struct sockaddr\u un
、IPv4的
struct sockaddr\u in
和IPv6的
struct sockaddr\u in6
struct sockaddr
类型是套接字API(用C编写)实现继承的方式

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


这意味着您应该在
中使用
struct sockaddr\u而不是
struct sockaddr
并在与套接字函数交互时将这些结构的地址强制转换为
struct sockaddr*
。这是使用这些函数的预期方式。

套接字API函数是以
struct sockaddr*
作为参数构建的,因为它可以接受多种套接字地址类型,即UNIX域套接字的
struct sockaddr\u un
,IPv4的
struct sockaddr\u,用于IPv6等的
struct sockaddr\u in6
类型是套接字API(用C编写)实现继承的方式

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

这意味着您应该在
中使用
struct sockaddr\u而不是
struct sockaddr
并在与套接字函数交互时将这些结构的地址强制转换为
struct sockaddr*
。这是使用这些函数的预期方式。

不能按值返回(或传递或以其他方式使用)
sockaddr
结构;
sockaddr
不是表示/包含数据的实际类型,而是早期C和Unix对实际套接字地址类型“派生自”的“基类”的误导性遗留抽象

如果你写C++,你的问题尽管你最初标记了C,但是你应该用你自己的类来表示数据,它公开了StultSockAdDR*<代码>,传递给需要它的Socket函数,同时使用一个合适的类型来进行内部存储。但是,通常不管你是使用C还是C++,都是错误的,手动创建这样的对象。您应该只使用

getaddrinfo

您不能按值返回(或传递或以其他方式使用)
sockaddr
结构;
sockaddr
不是表示/包含数据的实际类型,而是早期C和Unix对实际套接字地址类型“派生自”的“基类”的误导性遗留抽象


如果你写C++,你的问题尽管你最初标记了C,但是你应该用你自己的类来表示数据,它公开了StultSockAdDR*<代码>,传递给需要它的Socket函数,同时使用一个合适的类型来进行内部存储。但是,通常不管你是使用C还是C++,都是错误的,手动创建这样的对象。您应该只使用

getaddrinfo

您的代码不是有效的C代码。您确定您的C标记正确吗?您的代码不是有效的C代码。你确定你的C标签是正确的吗?我用C++加标签,但是它不能正确地格式化代码,它变成了绿色。@ PuBuZ07:标签不是告诉站点如何语法突出你的代码(它甚至这样做??),而是向人们展示你的问题,这是相关的。是的,标签确实改变了如何显示<代码>代码>代码>东西。我用C++标记,但是它不能正确地格式化代码,它变成了绿色。@标签:不是标记站点如何语法突出你的代码(它甚至这样做??),而是向人们展示你的问题,这是相关的。是的,标记确实会改变
code
内容的显示方式。好的,我明白了。。但是,如果我在while循环中调用
recvfrom
执行此操作,我是否在不断地消耗无意义的时间?我这样做是为了不必每秒强制转换100次。@pbuzz007强制转换不会产生很大的运行时成本,如果有的话,尤其是在指针类型之间。这是一个过早优化的例子,明白了。谢谢。!!!在普通实现中,强制转换指针没有任何运行时开销。在任何情况下,
recvfrom
的成本至少是单个操作员评估的2000倍(可能是10000倍),因此尝试优化后者毫无意义。好吧,我明白了。。但是,如果我在while循环中调用
recvfrom
执行此操作,我是否在不断地消耗无意义的时间?我这样做是为了不必每秒强制转换100次。@pbuzz007强制转换不会产生很大的运行时成本,如果有的话,尤其是在指针类型之间。这是一个过早优化的例子,明白了。谢谢。!!!在普通实现中,强制转换指针没有任何运行时开销。在任何情况下,
recvfrom
的成本至少是单个操作员评估的2000倍(可能是10000倍),因此尝试优化后者毫无意义。