请用c++写一个可连网的聊天软件
要实现一个可连网的聊天软件,你需要使用网络编程和socket编程来建立客户端和服务器之间的通信。以下是一个简单的示例代码:
客户端代码:
#include <iostream>
#include <string>
#include <WS2tcpip.h>
#pragma comment (lib, "ws2_32.lib")
int main() {
std::string ipAddress = "127.0.0.1"; // 服务器IP地址
int port = 54000; // 服务器端口号
// 初始化Winsock
WSADATA data;
WORD version = MAKEWORD(2, 2);
int wsOk = WSAStartup(version, &data);
if (wsOk != 0) {
std::cerr << "无法初始化Winsock" << std::endl;
return -1;
}
// 创建socket
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET) {
std::cerr << "无法创建socket" << std::endl;
WSACleanup();
return -1;
}
// 设置服务器地址和端口
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
inet_pton(AF_INET, ipAddress.c_str(), &(hint.sin_addr));
// 连接到服务器
int connResult = connect(sock, (sockaddr*)&hint, sizeof(hint));
if (connResult == SOCKET_ERROR) {
std::cerr << "无法连接到服务器" << std::endl;
closesocket(sock);
WSACleanup();
return -1;
}
// 循环接收和发送消息
char buf[4096];
std::string userInput;
do {
// 接收消息
ZeroMemory(buf, 4096);
int bytesReceived = recv(sock, buf, 4096, 0);
if (bytesReceived > 0) {
std::cout << "服务器: " << std::string(buf, 0, bytesReceived) << std::endl;
}
// 发送消息
std::cout << "> ";
std::getline(std::cin, userInput);
int sendResult = send(sock, userInput.c_str(), userInput.size() + 1, 0);
if (sendResult == SOCKET_ERROR) {
std::cerr << "无法发送消息" << std::endl;
break;
}
} while (true);
// 关闭socket
closesocket(sock);
// 清理Winsock
WSACleanup();
return 0;
}
服务器端代码:
#include <iostream>
#include <string>
#include <WS2tcpip.h>
#pragma comment (lib, "ws2_32.lib")
int main() {
std::string ipAddress = "127.0.0.1"; // 本地IP地址
int port = 54000; // 监听端口号
// 初始化Winsock
WSADATA data;
WORD version = MAKEWORD(2, 2);
int wsOk = WSAStartup(version, &data);
if (wsOk != 0) {
std::cerr << "无法初始化Winsock" << std::endl;
return -1;
}
// 创建socket
SOCKET listening = socket(AF_INET, SOCK_STREAM, 0);
if (listening == INVALID_SOCKET) {
std::cerr << "无法创建socket" << std::endl;
WSACleanup();
return -1;
}
// 设置服务器地址和端口
sockaddr_in hint;
hint.sin_family = AF_INET;
hint.sin_port = htons(port);
inet_pton(AF_INET, ipAddress.c_str(), &(hint.sin_addr));
// 绑定socket到IP地址和端口
bind(listening, (sockaddr*)&hint, sizeof(hint));
// 开始监听连接
listen(listening, SOMAXCONN);
std::cout << "服务器开始监听连接..." << std::endl;
// 等待连接
sockaddr_in client;
int clientSize = sizeof(client);
SOCKET clientSocket = accept(listening, (sockaddr*)&client, &clientSize);
char host[NI_MAXHOST]; // 客户端名字
char service[NI_MAXSERV]; // 客户端服务(端口)号
ZeroMemory(host, NI_MAXHOST);
ZeroMemory(service, NI_MAXSERV);
if (getnameinfo((sockaddr*)&client, sizeof(client), host, NI_MAXHOST, service, NI_MAXSERV, 0) == 0) {
std::cout << host << "连接到服务器" << std::endl;
}
else {
inet_ntop(AF_INET, &(client.sin_addr), host, NI_MAXHOST);
std::cout << host << "连接到服务器" << std::endl;
}
// 关闭监听socket
closesocket(listening);
// 循环接收和发送消息
char buf[4096];
while (true) {
ZeroMemory(buf, 4096);
// 接收消息
int bytesReceived = recv(clientSocket, buf, 4096, 0);
if (bytesReceived == SOCKET_ERROR) {
std::cerr << "接收消息时出错" << std::endl;
break;
}
if (bytesReceived == 0) {
std::cout << "客户端断开连接" << std::endl;
break;
}
std::cout << "客户端: " << std::string(buf, 0, bytesReceived) << std::endl;
// 发送消息
send(clientSocket, buf, bytesReceived + 1, 0);
}
// 关闭socket
closesocket(clientSocket);
// 清理Winsock
WSACleanup();
return 0;
}
以上代码是一个简单的聊天软件示例,可以在本地运行。你可以根据需要对其进行修改和扩展,以满足具体要求
原文地址: https://www.cveoy.top/t/topic/igAl 著作权归作者所有。请勿转载和采集!