用C++写一个本地聊天系统
时间: 2023-12-27 16:20:08 浏览: 52
这里是一个简单的本地聊天系统的 C++ 代码示例,使用了 socket 编程实现:
```c++
#include <iostream>
#include <cstring>
#include <string>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <thread>
using namespace std;
const int BUFFER_SIZE = 1024; // 缓冲区大小
void receive(int sock) {
char buffer[BUFFER_SIZE];
while (true) {
memset(buffer, 0, BUFFER_SIZE); // 清空缓冲区
int ret = recv(sock, buffer, BUFFER_SIZE, 0);
if (ret == -1) { // 接收失败
cout << "接收消息失败!" << endl;
break;
}
if (ret == 0) { // 对方关闭了连接
cout << "连接已关闭!" << endl;
break;
}
cout << "收到消息:" << buffer << endl;
}
}
int main() {
int server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字
if (server_sock == -1) {
cout << "创建套接字失败!" << endl;
return -1;
}
sockaddr_in server_addr{}; // 服务器地址
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8888); // 端口号
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 任意地址
// 绑定套接字和地址
int ret = bind(server_sock, (sockaddr*)&server_addr, sizeof(server_addr));
if (ret == -1) {
cout << "绑定套接字失败!" << endl;
return -1;
}
// 监听连接请求
ret = listen(server_sock, 5);
if (ret == -1) {
cout << "监听连接请求失败!" << endl;
return -1;
}
sockaddr_in client_addr{}; // 客户端地址
socklen_t client_addr_len = sizeof(client_addr);
// 接受连接请求
int client_sock = accept(server_sock, (sockaddr*)&client_addr, &client_addr_len);
if (client_sock == -1) {
cout << "接受连接请求失败!" << endl;
return -1;
}
char buffer[BUFFER_SIZE];
thread t(receive, client_sock); // 开启一个线程用于接收消息
t.detach(); // 分离线程
while (true) {
memset(buffer, 0, BUFFER_SIZE); // 清空缓冲区
cout << "请输入消息:";
cin.getline(buffer, BUFFER_SIZE);
if (strcmp(buffer, "exit") == 0) { // 用户输入 exit 退出程序
break;
}
ret = send(client_sock, buffer, strlen(buffer), 0);
if (ret == -1) { // 发送失败
cout << "发送消息失败!" << endl;
break;
}
}
close(client_sock); // 关闭套接字
close(server_sock);
return 0;
}
```
该程序使用了一个主线程和一个子线程分别用于发送和接收消息。主线程通过 `cin.getline` 获取用户输入的消息,并通过 `send` 函数将消息发送给客户端。子线程通过 `recv` 函数接收客户端发送的消息,并输出到控制台上。
需要注意的是,该代码只是一个简单的示例,实际的聊天系统需要考虑更多的安全性和用户体验等因素。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![-](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)