2015-04-20 61 views
2

我有执行下列步骤的程序:建立tcp连接时,什么样的地址给套接字?

客户端:

  1. 发送一个特定的端口上UDP请求(多播)
  2. 检查UDP响应
  3. 从所述响应中提取地址
  4. 设置套接字的地址和特定端口

服务器端:

  1. 接收并检查一个特定的端口
  2. 上UDP请求(多播)发送具有内部IP地址UDP响应。
  3. 建立套接字的地址和特定端口

我的问题是它不与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; 
} 
+0

我也许错了,但你检查什么是存储在你的结构addrinfo * addr;定期输出? – user2310994

回答

1

对于链路本地地址(FE80:*),你必须追加从中你想连接的接口:fe80:0000:0000:0000:0223:18ff:feed:ef59%enp0s25

+0

我测试了一些网络上可用的例子,例如:[link](http://www.electronicsfaq.com/2012/12/simple-tcp-client-server-sockets.html)。它与“:: 1”一起工作,但我没有与“fe80:0000:0000:0000:0223:18ff:feed:ef59”(无效参数)以及“fe80:0000:0000:0000:0223:18ff :feed:ef59%enp0s25“(没有这样的主机)。 也许我必须改变一些参数到网络设置。 (防火墙已禁用)。 – JeanRene

+0

您能否验证另一台主机的接口是否也称为enp0s25? – derhoch

+0

是的,因为我目前正在使用同一台机器。 – JeanRene