c - 创建一个不强制转换的 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;
}
解决方案
套接字 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 *
与套接字函数交互的任何时间。这是使用这些功能的预期方式。
推荐阅读
- java - 说在 String 变量中可以存储所有 ASCII 符号是否正确?
- javascript - jQuery:如何克隆包含 p5 画布的 div?
- powershell - 获取连接属性名称
- npm - NPM 的 package-lock.json 中的层次结构代表什么?
- python - QFont.setFamily() 不适用于自定义字体
- database - Firestore:如何通过计算在用户和全局级别存储数据?
- c++ - C++ 错误:'char[26]' 的初始化程序太多
- go - Azure DevOps 上的自动版本提升(如 Jenkins+Maven)
- typescript - 找不到名称“HttpParamsOptions”。角 6
- angular - Reactive-Forms:子组件中父级的 FormControl 验证器