c语言实现聊天室完整代码及注释
时间: 2023-10-11 20:08:30 浏览: 101
c语言学习项目-扫雷(附完整代码和注释).pdf
以下是一个简单的C语言实现聊天室的代码及注释:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_CLIENTS 5
#define BUFFER_SIZE 1024
void handle_client(int client_socket);
int main() {
int server_socket, client_socket;
struct sockaddr_in server_address, client_address;
int client_address_size;
pid_t child_pid;
// 创建服务器套接字
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("Error creating server socket");
exit(EXIT_FAILURE);
}
// 设置服务器地址
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;
server_address.sin_port = htons(8888);
// 绑定服务器套接字到指定地址和端口
if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("Error binding server socket");
exit(EXIT_FAILURE);
}
// 监听来自客户端的连接请求
if (listen(server_socket, MAX_CLIENTS) < 0) {
perror("Error listening for connections");
exit(EXIT_FAILURE);
}
printf("Chat server started on port 8888\n");
while (1) {
// 接受客户端连接请求
client_address_size = sizeof(client_address);
client_socket = accept(server_socket, (struct sockaddr *)&client_address, (socklen_t *)&client_address_size);
if (client_socket < 0) {
perror("Error accepting client connection");
exit(EXIT_FAILURE);
}
// 创建子进程来处理客户端连接
child_pid = fork();
if (child_pid == 0) {
// 子进程
close(server_socket);
handle_client(client_socket);
exit(EXIT_SUCCESS);
} else if (child_pid > 0) {
// 父进程
close(client_socket);
} else {
perror("Error creating child process");
exit(EXIT_FAILURE);
}
}
return 0;
}
void handle_client(int client_socket) {
char buffer[BUFFER_SIZE];
int read_size;
while ((read_size = recv(client_socket, buffer, BUFFER_SIZE, 0)) > 0) {
// 将接收到的消息广播给所有连接的客户端
for (int i = 0; i < MAX_CLIENTS; i++) {
if (clients[i] != 0 && clients[i] != client_socket) {
write(clients[i], buffer, strlen(buffer));
}
}
memset(buffer, 0, BUFFER_SIZE);
}
if (read_size == 0) {
// 客户端断开连接
printf("Client disconnected: %d\n", client_socket);
} else if (read_size == -1) {
perror("Error receiving data from client");
}
// 关闭客户端套接字
close(client_socket);
}
```
这段代码实现了一个简单的聊天室服务器。它使用`socket`函数创建服务器套接字,并使用`bind`函数将套接字绑定到指定的地址和端口。然后使用`listen`函数开始监听来自客户端的连接请求。
在主循环中,使用`accept`函数接受客户端连接请求,并创建一个子进程来处理客户端连接。在子进程中,使用`recv`函数接收客户端发送的消息,并将消息广播给所有连接的客户端。
当客户端断开连接时,子进程会关闭客户端套接字,并退出。父进程在接受客户端连接后关闭客户端套接字。
请注意,这只是一个简单的聊天室服务器示例,没有进行错误处理和安全性考虑。实际应用中,还需要添加更多的功能和安全措施。
阅读全文