您可以强制它在ai_family字段中使用IPv4或IPv6,或将其保留为AF_UNSPEC以使用任何内容.这很酷,因为您的代码可以与IP版本无关.
正如标题所说 - 总是使用的缺点(或风险,如果有的话)AF_UNSPEC,而不是指定IPv4或IPv6?
或者只是出于一个原因 - 如果指定了版本,这将保证只支持此版本吗?
一点背景 - 我考虑在客户端 - 服务器(C++)应用程序中添加对IPv6的支持,并且应该支持这两个版本.所以我想知道它是否可以使用,AF_UNSPEC或者最好"识别"字符串中的地址并使用AF_INET6或AF_INET取决于地址.
我目前在服务器和客户端之间传递消息时遇到问题.据我所知,我正在遵循Beej的套接字编程教程概述的套接字编程的最佳实践.
当我运行这两个进程时,recv()系统调用返回-1(错误),而不是接收的字节数.此外,当尝试输出buf时,有一堆gobbledygook字符.这是有道理的,因为错误.
我想知道是否有人可以引导我朝着正确的方向指导我为什么遇到recv()的问题?以下是相关的代码片段.
服务器:
struct sockaddr_storage their_addr;
socklen_t addr_size;
int sockfd, newfd, byte_count, status;
char buf[512];
struct addrinfo hints, *res;
// first, load up address structs with getaddrinfo():
memset(&hints, 0, sizeof hints);
hints.ai_family = PF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
// get address info, print stuff if error
if((status = getaddrinfo("nunki.usc.edu", "21957", &hints, &res)) !=0){
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}
// make a socket:
if((sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) == -1){
cout << …Run Code Online (Sandbox Code Playgroud)