C++ 语言 计算机网络面试题

C++阿木 发布于 3 天前 3 次阅读


C++ 网络编程面试题解析与代码实现

在计算机网络领域,C++ 语言因其高性能和灵活性而被广泛应用于网络编程。本文将围绕 C++ 网络编程面试题,解析常见问题并提供相应的代码实现,旨在帮助读者巩固网络编程知识,提升面试技巧。

1. 基础网络编程

1.1 创建套接字

在 C++ 中,使用 `socket` 函数创建套接字。以下是一个简单的示例:

cpp
include
include
include
include

int main() {
int sockfd;
struct sockaddr_in servaddr;

// 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
std::cerr << "Socket creation failed!" << std::endl;
return 1;
}

// 设置服务器地址结构
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8080);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

// 连接服务器
if (connect(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {
std::cerr << "Connection failed!" << std::endl;
return 1;
}

// 发送数据
const char message = "Hello, server!";
send(sockfd, message, strlen(message), 0);

// 接收数据
char buffer[1024] = {0};
int n = read(sockfd, buffer, 1024);
std::cout << "Received: " << buffer << std::endl;

// 关闭套接字
close(sockfd);
return 0;
}

1.2 网络字节序与主机字节序转换

在网络编程中,不同主机可能使用不同的字节序。以下是一个转换主机字节序和网络字节序的示例:

cpp
include
include

uint32_t htonl(uint32_t hostlong) {
return htonl(hostlong);
}

uint16_t htons(uint16_t hostshort) {
return htons(hostshort);
}

uint32_t ntohl(uint32_t netlong) {
return ntohl(netlong);
}

uint16_t ntohs(uint16_t netshort) {
return ntohs(netshort);
}

int main() {
uint32_t hostlong = 0x12345678;
uint16_t hostshort = 0x1234;

std::cout << "Host long: " << std::hex << hostlong << std::endl;
std::cout << "Host short: " << std::hex << hostshort << std::endl;

uint32_t netlong = htonl(hostlong);
uint16_t netshort = htons(hostshort);

std::cout << "Network long: " << std::hex << netlong << std::endl;
std::cout << "Network short: " << std::hex << netshort << std::endl;

return 0;
}

2. 高级网络编程

2.1 多线程网络编程

多线程可以提高网络应用程序的并发处理能力。以下是一个使用 POSIX 线程库(pthreads)的示例:

cpp
include
include
include
include
include

void client_handler(void socket_desc) {
// 处理客户端请求
// ...

return 0;
}

int main() {
int sockfd;
struct sockaddr_in servaddr;
pthread_t thread_id;

// 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
std::cerr << "Socket creation failed!" << std::endl;
return 1;
}

// 设置服务器地址结构
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8080);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");

// 绑定套接字
if (bind(sockfd, (struct sockaddr )&servaddr, sizeof(servaddr)) < 0) {
std::cerr << "Socket bind failed!" << std::endl;
return 1;
}

// 监听连接
listen(sockfd, 3);

// 接受连接
int new_socket;
struct sockaddr_in client_addr;
socklen_t c = sizeof(struct sockaddr_in);
new_socket = accept(sockfd, (struct sockaddr )&client_addr, &c);
if (new_socket < 0) {
std::cerr << "Accept failed!" << std::endl;
return 1;
}

// 创建线程处理客户端请求
if (pthread_create(&thread_id, NULL, client_handler, (void )&new_socket) < 0) {
std::cerr << "Thread creation failed!" << std::endl;
return 1;
}

// 等待线程结束
pthread_join(thread_id, NULL);

// 关闭套接字
close(new_socket);
close(sockfd);
return 0;
}

2.2 网络协议解析

网络协议解析是网络编程中的重要环节。以下是一个简单的 HTTP 协议解析示例:

cpp
include
include
include

std::string parse_http_request(const std::string &request) {
std::istringstream iss(request);
std::string line;
std::string method, url, version;
while (std::getline(iss, line)) {
if (line.empty()) {
break;
}
if (line.find("GET") != std::string::npos) {
method = "GET";
} else if (line.find("POST") != std::string::npos) {
method = "POST";
}
// 解析 URL 和版本
// ...
}
return method + " " + url + " " + version;
}

int main() {
std::string request = "GET /index.html HTTP/1.1rHost: www.example.comrr";
std::string parsed_request = parse_http_request(request);
std::cout << "Parsed Request: " << parsed_request << std::endl;
return 0;
}

3. 总结

本文通过解析 C++ 网络编程面试题,提供了基础和高级网络编程的代码示例。这些示例涵盖了套接字创建、网络字节序转换、多线程网络编程和网络协议解析等方面。通过学习和实践这些代码,读者可以巩固网络编程知识,提升面试技巧。