建立server listen服务器监听:
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> // for close()
#include <cstring> // for memset()
#define PORT 8080
#define MAX_CLIENTS 5 // 设置backlog大小
int main() {
// 1. 创建套接字
int server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (server_sockfd == -1) {
perror("socket");
return -1;
}
// 2. 配置套接字地址结构
sockaddr_in server_address;
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(PORT);
server_address.sin_addr.s_addr = htonl(INADDR_ANY); // 绑定到所有网络接口
// 3. 绑定套接字到指定地址
if (bind(server_sockfd, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {
perror("bind");
close(server_sockfd);
return -1;
}
// 4. 设置套接字为监听模式并设定backlog队列长度
if (listen(server_sockfd, MAX_CLIENTS) == -1) {
perror("listen");
close(server_sockfd);
return -1;
}
std::cout << "Server is listening on port " << PORT << std::endl;
// 5. 循环等待并接受客户端连接请求
while (true) {
sockaddr_in client_address;
socklen_t client_len = sizeof(client_address);
int client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_address, &client_len);
if (client_sockfd == -1) {
perror("accept");
continue;
}
std::cout << "Accepted connection from " << inet_ntoa(client_address.sin_addr) << ":" << ntohs(client_address.sin_port) << std::endl;
// 处理客户端连接相关逻辑...
char message[] = "Hello, Clienter!";
send(client_sockfd, message, strlen(message), 0); // 向服务器发送消息
char buffer[1024] = {0};
ssize_t bytes_received = recv(client_sockfd, buffer, sizeof(buffer) - 1, 0);
if (bytes_received > 0) {
buffer[bytes_received] = '\0'; // 添加字符串结束符
std::cout << "Received from client: " << buffer << std::endl;
}
// 关闭已处理完的客户端连接
close(client_sockfd);
}
// 当不再需要服务时关闭监听套接字
close(server_sockfd);
return 0;
}
建立Client客户端:
#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> // for close()
#include <cstring> // for memset()
#define SERVER_IP "127.0.0.1" // 本机IP地址
#define SERVER_PORT 8080 // 服务器端口号
int main() {
// 1. 创建套接字
int client_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (client_sockfd == -1) {
perror("socket");
return -1;
}
// 2. 填充服务器地址结构
sockaddr_in server_address;
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;
server_address.sin_port = htons(SERVER_PORT);
if (inet_pton(AF_INET, SERVER_IP, &server_address.sin_addr) <= 0) {
perror("inet_pton");
close(client_sockfd);
return -1;
}
// 3. 连接到服务器
if (connect(client_sockfd, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
perror("connect");
close(client_sockfd);
return -1;
}
std::cout << "Connected to server at IP " << SERVER_IP << ", Port: " << SERVER_PORT << std::endl;
// 4. 发送和接收数据(这里仅作演示,实际应用中会循环读写数据)
char message[] = "Hello, Server!";
send(client_sockfd, message, strlen(message), 0); // 向服务器发送消息
char buffer[1024] = {0};
ssize_t bytes_received = recv(client_sockfd, buffer, sizeof(buffer) - 1, 0); // 接收服务器回应
if (bytes_received > 0) {
buffer[bytes_received] = '\0'; // 添加字符串结束符
std::cout << "Received from server: " << buffer << std::endl;
} else if (bytes_received == 0) {
std::cout << "Server closed the connection." << std::endl;
} else {
perror("recv");
}
// 5. 关闭套接字
close(client_sockfd);
return 0;
}