c++做一个网络聊天室的代码
时间: 2023-06-13 21:08:38 浏览: 47
下面是一个简单的 C++ 网络聊天室的代码示例。该聊天室使用了基于 TCP 协议的套接字编程,可以实现客户端之间的聊天交流。
server.cpp:服务器端代码
```cpp
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#define PORT "8888" // 服务器端监听的端口号
#define MAX_CLIENTS 10 // 最大连接客户端的数量
int main() {
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
std::cerr << "WSAStartup failed: " << iResult << std::endl;
return 1;
}
// 创建套接字
addrinfo hints, *server_info, *p;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if (getaddrinfo(NULL, PORT, &hints, &server_info) != 0) {
std::cerr << "getaddrinfo failed" << std::endl;
return 1;
}
SOCKET server_socket;
for (p = server_info; p != NULL; p = p->ai_next) {
server_socket = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
if (server_socket == INVALID_SOCKET) {
std::cerr << "socket failed: " << WSAGetLastError() << std::endl;
continue;
}
if (bind(server_socket, p->ai_addr, p->ai_addrlen) == SOCKET_ERROR) {
closesocket(server_socket);
std::cerr << "bind failed: " << WSAGetLastError() << std::endl;
continue;
}
break;
}
if (p == NULL) {
std::cerr << "Unable to bind socket" << std::endl;
return 1;
}
freeaddrinfo(server_info);
// 监听端口
if (listen(server_socket, MAX_CLIENTS) == SOCKET_ERROR) {
std::cerr << "listen failed: " << WSAGetLastError() << std::endl;
return 1;
}
std::cout << "Server started, waiting for connections..." << std::endl;
// 接受客户端连接
sockaddr_storage client_addr;
socklen_t addr_len = sizeof(client_addr);
char ip_str[INET6_ADDRSTRLEN];
int client_socket;
char client_msg[1024];
fd_set master, read_fds;
FD_ZERO(&master);
FD_ZERO(&read_fds);
FD_SET(server_socket, &master);
int fd_max = server_socket;
while (true) {
read_fds = master;
if (select(fd_max + 1, &read_fds, NULL, NULL, NULL) == SOCKET_ERROR) {
std::cerr << "select failed: " << WSAGetLastError() << std::endl;
return 1;
}
for (int i = 0; i <= fd_max; i++) {
if (FD_ISSET(i, &read_fds)) {
if (i == server_socket) {
client_socket = accept(server_socket, (sockaddr *)&client_addr, &addr_len);
if (client_socket == INVALID_SOCKET) {
std::cerr << "accept failed: " << WSAGetLastError() << std::endl;
continue;
}
FD_SET(client_socket, &master);
if (client_socket > fd_max) {
fd_max = client_socket;
}
inet_ntop(client_addr.ss_family, &((sockaddr_in *)&client_addr)->sin_addr, ip_str, INET6_ADDRSTRLEN);
std::cout << "New connection from " << ip_str << ", socket fd is " << client_socket << std::endl;
} else {
iResult = recv(i, client_msg, sizeof(client_msg), 0);
if (iResult <= 0) {
if (iResult == 0) {
inet_ntop(client_addr.ss_family, &((sockaddr_in *)&client_addr)->sin_addr, ip_str, INET6_ADDRSTRLEN);
std::cout << "Connection closed by " << ip_str << ", socket fd is " << i << std::endl;
} else {
std::cerr << "recv failed: " << WSAGetLastError() << std::endl;
}
closesocket(i);
FD_CLR(i, &master);
} else {
for (int j = 0; j <= fd_max; j++) {
if (FD_ISSET(j, &master)) {
if (j != server_socket && j != i) {
send(j, client_msg, iResult, 0);
}
}
}
}
}
}
}
}
WSACleanup();
return 0;
}
```
client.cpp:客户端代码
```cpp
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
#define SERVER_IP "127.0.0.1" // 服务器端 IP 地址
#define SERVER_PORT "8888" // 服务器端监听的端口号
int main() {
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
std::cerr << "WSAStartup failed: " << iResult << std::endl;
return 1;
}
// 创建套接字
addrinfo hints, *server_info, *p;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if (getaddrinfo(SERVER_IP, SERVER_PORT, &hints, &server_info) != 0) {
std::cerr << "getaddrinfo failed" << std::endl;
return 1;
}
SOCKET client_socket;
for (p = server_info; p != NULL; p = p->ai_next) {
client_socket = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
if (client_socket == INVALID_SOCKET) {
std::cerr << "socket failed: " << WSAGetLastError() << std::endl;
continue;
}
if (connect(client_socket, p->ai_addr, p->ai_addrlen) == SOCKET_ERROR) {
closesocket(client_socket);
std::cerr << "connect failed: " << WSAGetLastError() << std::endl;
continue;
}
break;
}
if (p == NULL) {
std::cerr << "Unable to connect to server" << std::endl;
return 1;
}
freeaddrinfo(server_info);
// 发送消息
std::string message;
char send_buffer[1024];
int iSendResult;
while (true) {
std::cout << "> ";
std::getline(std::cin, message);
if (message.empty()) {
continue;
}
iSendResult = send(client_socket, message.c_str(), message.length(), 0);
if (iSendResult == SOCKET_ERROR) {
std::cerr << "send failed: " << WSAGetLastError() << std::endl;
break;
}
memset(send_buffer, 0, sizeof(send_buffer));
}
closesocket(client_socket);
WSACleanup();
return 0;
}
```