【发布时间】:2019-09-04 08:39:53
【问题描述】:
下面是 IPv6 和 IPv4 客户端代码示例代码的摘录:
IPv6
int s;
struct sockaddr_in6 addr;
s = socket(AF_INET6, SOCK_STREAM, 0);
addr.sin6_family = AF_INET6;
addr.sin6_port = htons(5000);
inet_pton(AF_INET6, "::1", &addr.sin6_addr);
connect(s, (struct sockaddr *)&addr, sizeof(addr));
IPv4
int s;
struct sockaddr_in addr;
s = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(5000);
servaddr.sin_addr.s_addr = INADDR_ANY;
connect(s, (struct sockaddr *)&addr, sizeof(addr));
我的目标是为 IPv6 和 IPv4 地址编写用户定义的连接 API。由于它们都将结构转换为 struct sockaddr 结构 - 我们如何以编程方式将 sockaddr_in 和 sockaddr_in6 转换为 sockaddr结构(填充其成员变量),然后用 sockaddr sturcure 调用 connect?
【问题讨论】:
-
我怀疑,
memcpy(&addr, &addr_in, sizeof(struct sockaddr)。 -
使用
getaddrinfo()以独立于协议的方式填充套接字地址结构。 -
"connect API" 你打算向这个 API 传递什么?
-
感谢 getaddrinfo() API 如何以独立于协议的方式填充结构?
-
"怎么能...." : 你可能想看看here。
标签: c sockets networking