我有执行下列步骤的程序:建立tcp连接时,什么样的地址给套接字?
客户端:
- 发送一个特定的端口上UDP请求(多播)
- 检查UDP响应
- 从所述响应中提取地址
- 设置套接字的地址和特定端口
服务器端:
- 接收并检查一个特定的端口
- 上UDP请求(多播)发送具有内部IP地址UDP响应。
- 建立套接字的地址和特定端口
我的问题是它不与IPv6地址的工作:fe80:0000:0000:0000:0223:18ff:feed:ef59
.. 但它与IPv6的映射IPv4地址工作:0000:0000:0000:0000:0000:ffff:0a40:4caf
(对应于10.64.76.175
)
根据维基百科,10.xxx.xxx.xxx
ipv4地址是私有类A地址fe80::/10
是链接本地地址。 是我问题的根源吗?
我得到这两个地址从以太网接口:
ip addr
2 : enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:23:18:ed:ef:59 brd ff:ff:ff:ff:ff:ff inet 10.64.76.175/20 brd 10.64.79.255 scope global enp0s25 valid_lft forever preferred_lft forever inet6 fe80::223:18ff:feed:ef59/64 scope link valid_lft forever preferred_lft forever
更准确地说,问题来源于此摘录:在socket()函数发送回错误。
int SetupTCPClientSocket(const char *host, const char *service) {
// Tell the system what kind(s) of address info we want
struct addrinfo addrCriteria; // Criteria for address match
memset(&addrCriteria, 0, sizeof(addrCriteria)); // Zero out structure
addrCriteria.ai_family = AF_UNSPEC; // v4 and v6 is OK
addrCriteria.ai_socktype = SOCK_STREAM; // Only streaming sockets
addrCriteria.ai_protocol = IPPROTO_TCP; // Only TCP protocol
// Get address(es)
struct addrinfo *servAddr; // Holder for returned list of server addrs
int rtnVal = getaddrinfo(host, service, &addrCriteria, &servAddr);
if (rtnVal != 0)
DieWithUserMessage("getaddrinfo() failed", gai_strerror(rtnVal));
int sock = -1;
struct addrinfo *addr;
for (addr = servAddr; addr != NULL; addr = addr->ai_next)
{
// Create a reliable, stream socket using TCP
sock = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
if (sock < 0)
{
continue; // Socket creation failed; try next address
}
// Establish the connection to the echo server
if (connect(sock, addr->ai_addr, addr->ai_addrlen) == 0)
{
break; // Socket connection succeeded; break and return socket
}
close(sock); // Socket connection failed; try next address
sock = -1;
}
freeaddrinfo(servAddr); // Free addrinfo allocated in getaddrinfo()
return sock;
}
我也许错了,但你检查什么是存储在你的结构addrinfo * addr;定期输出? – user2310994