请用C++写一段TCP通信代码,要求客户端和服务器可以定时收发消息
时间: 2024-01-15 11:02:54 浏览: 26
以下是一个简单的基于TCP协议的客户端和服务器代码示例,可以定时收发消息。在客户端和服务器端之间进行双向通信,每隔1秒发送一条消息:
服务端代码:
```cpp
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 8080
#define MAX_BUFFER_SIZE 1024
int main() {
std::cout << "Starting server..." << std::endl;
// 创建socket文件描述符
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) {
std::cerr << "Failed to create socket" << std::endl;
exit(EXIT_FAILURE);
}
// 设置server地址信息
sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// 绑定socket到指定地址和端口
if (bind(server_fd, (sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
std::cerr << "Failed to bind socket to address" << std::endl;
exit(EXIT_FAILURE);
}
// 监听socket
if (listen(server_fd, 10) == -1) {
std::cerr << "Failed to listen on socket" << std::endl;
exit(EXIT_FAILURE);
}
std::cout << "Server listening on port " << PORT << std::endl;
// 处理连接请求
while (true) {
sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
// 接受连接请求
int client_fd = accept(server_fd, (sockaddr *)&client_addr, &client_addr_len);
if (client_fd == -1) {
std::cerr << "Failed to accept connection" << std::endl;
continue;
}
std::cout << "Accepted new connection from " << inet_ntoa(client_addr.sin_addr) << std::endl;
// 处理客户端请求
while (true) {
char buffer[MAX_BUFFER_SIZE] = {0};
int bytes_read = read(client_fd, buffer, MAX_BUFFER_SIZE);
if (bytes_read == -1) {
std::cerr << "Failed to read from socket" << std::endl;
break;
}
if (bytes_read == 0) {
std::cout << "Connection closed by client" << std::endl;
break;
}
std::cout << "Received message: " << buffer << std::endl;
// 发送回复消息
std::string reply_message = "Received message: ";
reply_message.append(buffer);
write(client_fd, reply_message.c_str(), reply_message.length());
}
// 关闭客户端连接
close(client_fd);
}
// 关闭服务器socket
close(server_fd);
return 0;
}
```
客户端代码:
```cpp
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#define PORT 8080
#define MAX_BUFFER_SIZE 1024
int main() {
std::cout << "Starting client..." << std::endl;
// 创建socket文件描述符
int client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd == -1) {
std::cerr << "Failed to create socket" << std::endl;
exit(EXIT_FAILURE);
}
// 设置server地址信息
sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
// 解析server地址
struct hostent *host = gethostbyname("localhost");
if (host == NULL) {
std::cerr << "Failed to resolve server address" << std::endl;
exit(EXIT_FAILURE);
}
server_addr.sin_addr = *((in_addr *)host->h_addr);
// 连接到server
if (connect(client_fd, (sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
std::cerr << "Failed to connect to server" << std::endl;
exit(EXIT_FAILURE);
}
std::cout << "Connected to server on port " << PORT << std::endl;
// 发送和接收消息
while (true) {
// 发送消息
std::string message = "Hello, server!";
write(client_fd, message.c_str(), message.length());
std::cout << "Sent message: " << message << std::endl;
// 接收回复消息
char buffer[MAX_BUFFER_SIZE] = {0};
int bytes_read = read(client_fd, buffer, MAX_BUFFER_SIZE);
if (bytes_read == -1) {
std::cerr << "Failed to read from socket" << std::endl;
break;
}
if (bytes_read == 0) {
std::cout << "Connection closed by server" << std::endl;
break;
}
std::cout << "Received message: " << buffer << std::endl;
// 等待1秒
sleep(1);
}
// 关闭socket
close(client_fd);
return 0;
}
```