gpt4 book ai didi

c - 希望我的客户端程序通过 IPv4 或 IPv6 连接

转载 作者:行者123 更新时间:2023-12-03 19:33:38 25 4
gpt4 key购买 nike

目前,以下程序仅使用 IPv4 地址进行连接。
我希望修改它以使用服务器的任何 IPv6 或 IPv4 地址连接到服务器(兼容接受 IPv4 和 IPv6 客户端)。

            #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include "common.h"
#include "client.h"



int
CreateClientTCP(const char *svrHost,
unsigned short svrPort,
char *svrName,
int svrNameLen)
{
int sock;
struct sockaddr_in svrAddr;

sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("Failed to allocate the client socket");
exit(EXIT_FAILURE);
}

memset(&svrAddr, 0, sizeof(svrAddr));
svrAddr.sin_family = AF_INET;
svrAddr.sin_port = htons(svrPort);

if (inet_pton(AF_INET, svrHost, &svrAddr.sin_addr.s_addr) <= 0) {
perror("Failed to convert IP address\n");
exit(EXIT_FAILURE);
}

SocketAddrToString(&svrAddr, svrName, svrNameLen);
Log("Attempting %s\n", svrName);

if (connect(sock, (struct sockaddr *)&svrAddr, sizeof(svrAddr)) < 0) {
perror("Failed to connect to the server");
exit(EXIT_FAILURE);
}

return sock;
}



int
main(int argc, char *argv[])
{
int sock;
ClientArgs cliArgs;
char svrName[INET_ADDRSTRLEN + PORT_STRLEN];

ParseArgs(argc, argv, &cliArgs);

sock = CreateClientTCP(cliArgs.svrHost, cliArgs.svrPort,
svrName, sizeof svrName);

Log("Connected to server at %s\n", svrName);

Client(sock, &cliArgs);

close(sock);
Log("\nDisconnected from server at %s\n", svrName);
return 0;
}

最佳答案

除了颤振的回答之外,您还需要稍微更改代码的结构。

而不是创建一个套接字然后查找您需要调用的地址 getaddrinfo获取给定主机名的所有地址。主机名通常是双堆栈的,因此您将获得多个 IPv4 和/或 IPv6 地址。它们通常按照您应该尝试的顺序进行排序。所以一一循环所有地址,直到连接成功。

因为有些地址将是 IPv4,有些将是 IPv6,所以您无法预先创建套接字。对于您尝试的每个地址,您应该创建一个属于您尝试连接的地址的地址族的新套接字。 Flter 已经向你展示了如何。

连接成功后,您将中断循环并使用已建立的连接。

关于c - 希望我的客户端程序通过 IPv4 或 IPv6 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36819257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com