【发布时间】:2018-06-05 19:17:23
【问题描述】:
我有一个基于 TCP 的程序,它同时支持 IPv4 和 IPv6。所以我在代码中使用了“sockaddr_storage”。
在 client 端,我需要将客户端 TCP 端口固定到特定端口,因此我需要将套接字绑定到该地址。
struct sockaddr_storage local_addrs; //for local address
if (sc->domain == AF_INET) {
(*(struct sockaddr_in*)&local_addrs).sin_family = AF_INET;
(*(struct sockaddr_in*)&local_addrs).sin_addr.s_addr = inet_addr(INADDR_ANY);
(*(struct sockaddr_in*)&local_addrs).sin_port = htons(tcp_port);
}
else{
(*(struct sockaddr_in6*)&local_addrs).sin6_family = AF_INET6;
(*(struct sockaddr_in6*)&local_addrs).sin_addr.s_addr = inet_addr(IN6ADDR_ANY_INIT);
(*(struct sockaddr_in6*)&local_addrs).sin6_port = htons(tcp_port);
}
local_addr_size = sizeof(local_addrs);
if (( ret = bind(sockfd, (struct sockaddr *)&local_addrs, local_addr_size)) < 0 ) {
....//error
}
如何初始化struct sockaddr_storage local_addrs?我需要为这个结构分配内存吗?
顺便说一句,下面的行还不行。仍在尝试找出如何将客户端 sokcet 绑定到任何可能的 IPv6 地址。
(*(struct sockaddr_in6*)&local_addrs).sin_addr.s_addr = inet_addr(IN6ADDR_ANY_INIT);
【问题讨论】:
-
为什么要绑定 client 套接字?这对于 TCP 来说是非常不寻常的。
-
正如我在问题中所说,我想将本地 TCP 端口绑定到特定端口,以进行测试。 :)
-
这里的
sc->domain是什么?