当涉及到基本的TCP/IP通信验证代码时,可以创建一个简单的服务器和客户端来进行通信。下面分别展示一个简单的C++ TCP/IP服务器和客户端的示例代码。
TCP/IP 服务器示例代码
这是一个简单的TCP/IP服务器,它监听指定端口并接收来自客户端的连接。一旦连接建立,它会接收客户端发送的数据并原样返回给客户端。
cpp
#include
#include
#include
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
constexpr int PORT = 8888;
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[1024] = {0};
const char *response = “Hello from server”;
// 创建套接字
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置套接字选项
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt");
exit(EXIT_FAILURE);
}
// 绑定端口和IP
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
std::cout << "Server listening on port " << PORT << std::endl;
// 接受连接并处理
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
// 接收和发送数据
int valread;
while ((valread = read(new_socket, buffer, 1024)) > 0) {
std::cout << "Received: " << buffer << std::endl;
send(new_socket, response, strlen(response), 0);
memset(buffer, 0, sizeof(buffer));
}
return 0;
}
TCP/IP 客户端示例代码
这是一个简单的TCP/IP客户端,它连接到指定的服务器和端口,并发送一条消息。然后它等待并打印从服务器接收的响应。
cpp
#include
#include
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
constexpr int PORT = 8888;
constexpr char *SERVER_IP = “127.0.0.1”;
int main() {
int sock = 0, valread;
struct sockaddr_in serv_addr;
const char *message = “Hello from client”;
char buffer[1024] = {0};
// 创建套接字
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
std::cerr << "Socket creation error" << std::endl;
return -1;
}
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
// 将 IPv4 字符串转换为地址结构
if (inet_pton(AF_INET, SERVER_IP, &serv_addr.sin_addr) <= 0) {
std::cerr << "Invalid address/ Address not supported" << std::endl;
return -1;
}
// 连接到服务器
if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
std::cerr << "Connection Failed" << std::endl;
return -1;
}
// 发送消息
send(sock, message, strlen(message), 0);
std::cout << "Message sent to server" << std::endl;
// 接收响应
valread = read(sock, buffer, 1024);
std::cout << "Server response: " << buffer << std::endl;
return 0;
}
解释代码逻辑
服务器代码:
创建套接字 (socket()) 并绑定到端口 (bind()).
使用 listen() 开始监听连接请求,并使用 accept() 接受来自客户端的连接。
使用 read() 和 send() 在连接上接收和发送数据。
客户端代码:
创建套接字 (socket()) 并使用 connect() 连接到服务器。
使用 send() 发送消息给服务器,并使用 read() 读取来自服务器的响应。
注意事项
这些代码是简单的示例,适合用于理解基本的TCP/IP通信原理和函数调用。
在实际应用中,应添加错误处理和更复杂的逻辑来处理连接断开、超时和其他异常情况。
通过这些示例代码,你可以理解如何在C++中实现基本的TCP/IP通信,从而构建更复杂的网络应用程序。