下面是一个简单的基于C++和TCP的P2P(点对点)示例。该示例包括一个简单的服务器和客户端,使用TCP进行通信。我们将使用标准C++库和POSIX sockets来实现这一点。
示例代码
1. TCP Server (server.cpp)
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
#define BUFFER_SIZE 1024
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[BUFFER_SIZE] = {0};
// 创建套接字
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
std::cerr << "Socket creation error\n";
return -1;
}
// 限制端口重复使用
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
// 配置地址结构
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY; // 使用本机IP地址
address.sin_port = htons(PORT);
// 绑定套接字到指定端口
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
std::cerr << "Binding failed\n";
return -1;
}
// 开始监听连接请求
if (listen(server_fd, 3) < 0) {
std::cerr << "Listen failed\n";
return -1;
}
std::cout << "Waiting for connections...\n";
// 接受连接请求
if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
(socklen_t*)&addrlen)) < 0) {
std::cerr << "Accept failed\n";
return -1;
}
// 循环接收数据
while (true) {
memset(buffer, 0, BUFFER_SIZE);
int valread = read(new_socket , buffer, BUFFER_SIZE);
if(valread > 0){
std::cout << "Message from client: " << buffer << "\n";
send(new_socket , buffer , strlen(buffer) , 0 ); // 回显消息给客户端
} else {
break;
}
}
close(new_socket);
close(server_fd);
return 0;
}
2. TCP Client (client.cpp)
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
#define BUFFER_SIZE 1024
int main() {
int sock = 0;
struct sockaddr_in serv_addr;
// 创建套接字
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cerr << "Socket creation error \n";
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 将IPv4地址从文本转换为二进制形式
if(inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr)<=0) {
std::cerr << "Invalid address / Address not supported \n";
return -1;
}
// 尝试连接到服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
std::cerr << "Connection Failed \n";
return -1;
}
char buffer[BUFFER_SIZE];
while(true){
std::string message;
std::cout << "Enter message: ";
getline(std::cin,message);
send(sock , message.c_str() , message.size() , 0 ); //发送消息至服务器
memset(buffer, '\0', BUFFER_SIZE);
read(sock , buffer , BUFFER_SIZE); //读取回显消息
std::cout<<"Server reply: "<<buffer<<std::endl;
}
close(sock);
return 0;
}
编译与运行
你可以使用g++编译这两个文件,并运行它们。
编译命令:
g++ server.cpp -o server
g++ client.cpp -o client
启动服务端:
在终端中运行:
./server
启动客户端:
在另一个终端中运行:
./client
测试
- 首先启动服务器,然后启动客户端。
- 在客户端输入消息,它将被发送到服务器,服务器会回显相同的消息。
- 可以在多个客户端之间进行通信,但请注意,这个简单示例没有实现多线程或异步处理,因此每次只能处理一个连接。
注意事项
- 上述代码仅用于学习目的,缺乏错误处理和多用户支持。在实际应用中,应考虑多线程或异步IO以支持多个并发连接。
- 确保防火墙允许通过指定的端口进行通信(如8080)。
内容由零声教学AI助手提供,问题来源于学员提问