在Linux中进行C++网络编程,通常会使用套接字(socket)API。套接字是一种通信端点,它允许不同计算机上的进程通过Internet协议(IP)网络进行通信。以下是一些C++网络编程的基础知识:
#include <sys/socket.h> // 包含套接字相关的定义
#include <netinet/in.h> // 包含IPv4地址相关的定义
#include <arpa/inet.h> // 包含inet_addr()等函数
#include <unistd.h> // 包含close()等函数
#include <string.h> // 包含memset()等函数
#include <iostream> // 包含标准输入输出
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
// 处理错误
}
这里AF_INET表示使用IPv4地址族,SOCK_STREAM表示使用TCP协议。
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(8080); // 端口号,使用htons()函数转换为主机字节序
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr); // IP地址,使用inet_pton()函数
if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
// 处理错误
}
if (listen(sockfd, 5) < 0) {
// 处理错误
}
这里的5是允许的最大连接数。
struct sockaddr_in cli_addr;
socklen_t clilen = sizeof(cli_addr);
int newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
if (newsockfd < 0) {
// 处理错误
}
// 发送数据
const char *message = "Hello, World!";
int n = send(newsockfd, message, strlen(message), 0);
if (n < 0) {
// 处理错误
}
// 接收数据
char buffer[256];
n = recv(newsockfd, buffer, 255, 0);
if (n < 0) {
// 处理错误
}
buffer[n] = '\0'; // 确保字符串以null结尾
std::cout << "Received message: " << buffer << std::endl;
close(newsockfd);
close(sockfd);
这是一个非常基础的TCP服务器示例。在实际应用中,你可能需要处理多个客户端连接,这通常涉及到多线程或异步I/O。
对于客户端,你需要创建一个套接字,然后使用connect()函数连接到服务器的地址和端口。之后,你可以像服务器一样使用send()和recv()函数来发送和接收数据。
请注意,错误处理在这里被省略了,实际编程中应该包含适当的错误检查和处理代码。此外,为了编写健壮的网络应用程序,还需要考虑诸如超时、信号处理、资源管理和安全性等问题。