面试题答案
一键面试在非阻塞I/O模型下,要在后端开发中实现对IPv6地址的基本支持,以下以Python为例进行说明:
- 套接字的创建
import socket
# 创建IPv6套接字对象,指定使用IPv6地址族(AF_INET6)和SOCK_STREAM(TCP)类型
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
# 设置套接字为非阻塞模式
sock.setblocking(0)
- 绑定
# 绑定地址和端口,地址可以是IPv6地址字符串,端口号为整数,后面两个参数一般为0
server_address = ('2001:db8::1', 8080, 0, 0)
sock.bind(server_address)
- 监听
# 开始监听,参数为最大连接数
sock.listen(5)
在其他编程语言(如C、Java等)中,实现原理类似,但具体函数和语法有所不同:
C语言示例:
- 套接字的创建
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
int sockfd;
// 创建IPv6套接字
sockfd = socket(AF_INET6, SOCK_STREAM, 0);
// 设置为非阻塞
int flags = fcntl(sockfd, F_GETFL, 0);
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
- 绑定
struct sockaddr_in6 servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin6_family = AF_INET6;
servaddr.sin6_port = htons(8080);
inet_pton(AF_INET6, "2001:db8::1", &servaddr.sin6_addr);
bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
- 监听
listen(sockfd, 5);
Java示例:
- 套接字的创建
import java.net.InetSocketAddress;
import java.nio.channels.ServerSocketChannel;
try {
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress("2001:db8::1", 8080));
// 设置为非阻塞
serverSocketChannel.configureBlocking(false);
} catch (Exception e) {
e.printStackTrace();
}
以上示例展示了在不同语言中,如何在非阻塞I/O模型下实现对IPv6地址的套接字创建、绑定与监听过程。