使用c++实现一个tcp socket的服务端程序,实现以下功能:1、该服务端一直监听客户端的请求 2、能够将接收的消息传递出来
时间: 2024-02-03 09:13:46 浏览: 113
c++ socket编程实例(包含服务端及客户端)
以下是一个简单的TCP socket服务端程序,它可以实现监听客户端请求并将收到的消息传递出来:
```c++
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
// 创建socket
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) {
std::cerr << "Failed to create socket\n";
return 1;
}
// 绑定端口和IP
struct sockaddr_in server_addr;
std::memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET; // IPv4
server_addr.sin_port = htons(8888); // 端口
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // IP
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
std::cerr << "Failed to bind\n";
return 1;
}
// 监听客户端请求
if (listen(server_fd, 10) == -1) {
std::cerr << "Failed to listen\n";
return 1;
}
std::cout << "Server started, listening on port 8888...\n";
// 建立连接
int client_fd;
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
char buffer[1024];
while (true) {
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);
if (client_fd == -1) {
std::cerr << "Failed to accept client\n";
continue;
}
std::cout << "Client connected: " << inet_ntoa(client_addr.sin_addr) << ":" << ntohs(client_addr.sin_port) << "\n";
// 接受消息并处理
while (true) {
int len = recv(client_fd, buffer, sizeof(buffer), 0);
if (len == -1) {
std::cerr << "Failed to receive message\n";
break;
} else if (len == 0) {
std::cout << "Client disconnected\n";
break;
} else {
std::cout << "Received message: " << buffer << "\n";
// 处理消息
send(client_fd, buffer, len, 0);
}
}
// 关闭连接
close(client_fd);
}
// 关闭socket
close(server_fd);
return 0;
}
```
在该程序中,我们首先创建了一个socket,并绑定到指定的端口和IP上。然后通过调用listen函数监听客户端请求,建立连接后,我们就可以接收客户端发送的消息并进行处理,处理完毕后再将消息发送回客户端。最后,我们需要关闭连接并关闭socket。
需要注意的是,在接收消息时,我们使用recv函数来接收消息,它会阻塞程序直到收到消息或出错。如果收到的消息长度为0,说明客户端已经断开连接,需要关闭连接并退出循环。
阅读全文