首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在建立tcp连接时,给套接字什么样的地址?

在建立tcp连接时,给套接字什么样的地址?
EN

Stack Overflow用户
提问于 2015-04-20 13:16:07
回答 1查看 654关注 0票数 2

我有一个计划,执行以下步骤:

客户端:

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

服务器端:

  1. 接收和检查特定端口上的UDP请求(多播)
  2. 发送包含其ip地址的UDP响应。
  3. 设置地址和特定端口的套接字。

我的问题是它不适用于ipv6地址: fe80:0000:0000:0000:0223:18ff:feed:ef59

..,但它适用于ipv6 6映射的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:<广播、多播、UP、LOWER_UP> mtu 1500 qdisc pfifo_fast状态向上qlen 1000链接/以太00:23:18:ed:ef:59 brd :ff ineton10.64.76.175/20 brd 10.64.79.255范围全球enp0s25 valid_lft永存inet6 fe80:223:18ff:feed:ef59/64作用域永久链接valid_lft永远preferred_lft

更准确地说,问题来自于这个提取:套接字()函数返回一个错误。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-20 13:40:07

对于链接本地地址(fe80:*),必须附加要从其中进行连接的接口:fe80:0000:0000:0000:0223:18ff:feed:ef59%enp0s25

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29748975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档