【发布时间】:2018-08-18 18:39:36
【问题描述】:
我是套接字编程的新手,并且正在编写一些临时代码以更好地感受它,但遇到了障碍。任何关于我做错了什么的指导将不胜感激!
我正在尝试编写一个简单的程序来绑定和侦听用户指定的端口,并向任何连接发送“Hello”消息。为了好玩,我想我会在同一个端口上监听所有 IPv4 和 IPv6 地址。这是一个代码sn-p:
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if ( getaddrinfo(NULL, argv[1], &hints, &res) != 0 ) {
printf("getaddrinfo failed!\n");
return 1;
}
for ( addrinfo* p = res; p != NULL; p = p->ai_next ) {
inet_ntop(p->ai_family, get_addr_ptr(p->ai_addr), ipstr, sizeof ipstr);
printf("Found IP: %s\n",ipstr);
printf("\tGetting socket...\t");
sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
if ( sockfd == -1 ) {
perror("\t\tError");
continue;
}
printf("OK\n");
printf("\tBind Socket to Port...\t");
if ( bind(sockfd, p->ai_addr, p->ai_addrlen) == -1 ) {
perror("\t\tError");
close(sockfd);
continue;
}
printf("OK\n");
printf("\tListen on socket...\t");
if ( listen(sockfd, BACKLOG) == -1 ){
perror("\t\tError");
continue;
}
printf("OK\n");
}
freeaddrinfo(res);
while (1) {/* accept connections */}
当我运行代码时,我得到这个输出:
$ ./simpleServer 8080
Found IP: 0.0.0.0
Getting socket... OK
Bind Socket to Port... OK
Listen on socket... OK
Found IP: ::
Getting socket... OK
Bind Socket to Port...
Error: Address already in use
但是,如果我在程序运行时查看netstat,我看不到任何与:: 相关联的冲突端口,或与此相关的任何其他 IPv6 地址。
我对此进行了更多尝试,发现我可以仅使用 IPv4 或仅使用 IPv6 绑定到端口,但不能同时使用这两者,我不明白。我创建了两个套接字,具有以下 ai_addr:
- 家庭:
AF_INET地址信息:0.0.0.0:8008 - 家庭:
AF_INET6地址信息::::8080
我觉得我可能遗漏了一些基本的东西,但我看不到它。
谢谢!
【问题讨论】:
-
请提供minimal, complete and verifiable example 以增加人们回答的机会。
标签: c++ c sockets networking