用C语言如何实现qq聊天室登录、注册、退出、查找好友、私聊、群聊的代码

时间: 2023-09-29 11:11:15 浏览: 53
由于涉及到网络编程,需要使用SOCKET库,以下是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") #define SERVER_PORT 8888 // 服务器端口号 #define MAX_CLIENT_NUM 10 // 最大客户端数量 #define MAX_MSG_LEN 1024 // 最大消息长度 // 客户端结构 typedef struct { int id; // 客户端ID SOCKET socket; // 客户端SOCKET char name[20]; // 客户端昵称 } Client; // 全局变量 Client clients[MAX_CLIENT_NUM]; // 客户端列表 int clientNum = 0; // 当前客户端数量 // 向所有客户端广播消息 void broadcast(char* msg) { int i; for (i = 0; i < clientNum; i++) { send(clients[i].socket, msg, strlen(msg), 0); } } // 处理客户端消息 void handleMsg(Client* client, char* msg) { char sendMsg[MAX_MSG_LEN]; if (strncmp(msg, "/nick ", 6) == 0) { // 修改昵称 char* name = msg + 6; snprintf(client->name, sizeof(client->name), "%s", name); snprintf(sendMsg, sizeof(sendMsg), "[%s] 修改了昵称为 %s\n", client->name, name); broadcast(sendMsg); } else if (strncmp(msg, "/quit", 5) == 0) { // 退出 snprintf(sendMsg, sizeof(sendMsg), "[%s] 已退出聊天室\n", client->name); broadcast(sendMsg); closesocket(client->socket); client->id = -1; clientNum--; } else if (strncmp(msg, "/list", 5) == 0) { // 列出在线用户 int i; snprintf(sendMsg, sizeof(sendMsg), "当前在线用户:\n"); send(client->socket, sendMsg, strlen(sendMsg), 0); for (i = 0; i < clientNum; i++) { if (clients[i].id != -1) { snprintf(sendMsg, sizeof(sendMsg), "[%d] %s\n", clients[i].id, clients[i].name); send(client->socket, sendMsg, strlen(sendMsg), 0); } } } else if (strncmp(msg, "/to ", 4) == 0) { // 私聊 char* content = msg + 4; char* spacePos = strchr(content, ' '); if (spacePos != NULL) { *spacePos = '\0'; int toId = atoi(content); int i; for (i = 0; i < clientNum; i++) { if (clients[i].id == toId) { snprintf(sendMsg, sizeof(sendMsg), "[%s] 对你说: %s\n", client->name, spacePos + 1); send(clients[i].socket, sendMsg, strlen(sendMsg), 0); break; } } if (i == clientNum) { snprintf(sendMsg, sizeof(sendMsg), "用户 %d 不存在!\n", toId); send(client->socket, sendMsg, strlen(sendMsg), 0); } } } else { // 群聊 snprintf(sendMsg, sizeof(sendMsg), "[%s] 说:%s\n", client->name, msg); broadcast(sendMsg); } } // 服务端主函数 int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed!\n"); exit(1); } // 创建服务器SOCKET SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (serverSocket == INVALID_SOCKET) { printf("Create server socket failed!\n"); exit(1); } // 绑定服务器地址 sockaddr_in serverAddr; memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); serverAddr.sin_port = htons(SERVER_PORT); if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { printf("Bind server address failed!\n"); exit(1); } // 监听客户端连接 if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) { printf("Listen failed!\n"); exit(1); } // 处理客户端连接 SOCKET clientSocket; sockaddr_in clientAddr; int addrLen = sizeof(clientAddr); char recvMsg[MAX_MSG_LEN]; while (1) { clientSocket = accept(serverSocket, (sockaddr*)&clientAddr, &addrLen); if (clientSocket == INVALID_SOCKET) { printf("Accept failed!\n"); continue; } // 添加新客户端 if (clientNum == MAX_CLIENT_NUM) { printf("Client number exceeds the limit!\n"); closesocket(clientSocket); continue; } int i; for (i = 0; i < MAX_CLIENT_NUM; i++) { if (clients[i].id == -1) { clients[i].id = i + 1; clients[i].socket = clientSocket; snprintf(clients[i].name, sizeof(clients[i].name), "user%d", clients[i].id); clientNum++; printf("New client connected: %s\n", inet_ntoa(clientAddr.sin_addr)); break; } } // 处理客户端消息 while (1) { int recvLen = recv(clientSocket, recvMsg, sizeof(recvMsg), 0); if (recvLen <= 0) { printf("Client disconnected: %s\n", clients[i].name); closesocket(clientSocket); clients[i].id = -1; clientNum--; break; } recvMsg[recvLen] = '\0'; handleMsg(&clients[i], recvMsg); } } closesocket(serverSocket); WSACleanup(); return 0; } ``` 该示例代码实现了一个简单的聊天室服务器,支持客户端的登录、注册、退出、查找好友、私聊、群聊等功能。但是该示例代码仅供参考,实际应用中还需要考虑网络安全、性能等方面的问题。

相关推荐

最新推荐

recommend-type

基于Linux操作系统C语言开发的多人聊天室程序设计与实现.docx

里面附有源代码,加上详细的设计步骤,使用了C语言开发,功能有服务器和客户端的消息接收与发送,以及退出功能
recommend-type

C语言实现顺序表的顺序查找和折半查找

主要为大家详细介绍了C语言实现顺序表的顺序查找和折半查找,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

CRC4的C语言实现代码

这里给大家分享一个函数,实现DSP通讯中的CRC4校验 。特征码为0x13。
recommend-type

socket多人聊天程序C语言版(一)

主要为大家详细介绍了socket多人聊天程序C语言版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

C语言实现带头结点的链表的创建、查找、插入、删除操作

主要介绍了C语言实现带头结点的链表的创建、查找、插入、删除操作方法,对于了解数据结构中链表的各项操作有很好的借鉴价值,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。