C语言编写一个基于TCP协议的简单聊天室程序。服务器在指定端口监听连接请求,并维护一个已连接客户端的列表。每个客户端连接后,可以发送消息给服务器,服务器将消息广播给所有已连接的客户端。
时间: 2024-10-09 17:10:20 浏览: 79
基于C语言实现 Linux 系统下的聊天室程序【100012562】
5星 · 资源好评率100%
在C语言中,我们可以使用socket编程技术来实现一个简单的TCP聊天室服务器。下面是一个基本的示例,展示了如何创建服务器、监听连接、接收和广播消息的基本流程。注意,这只是一个基础的框架,实际项目可能需要更复杂的错误处理和线程管理机制。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_CLIENTS 10
#define PORT 12345
#define BUFFER_SIZE 1024
typedef struct client {
int socket_fd;
char username[64];
} Client;
Client clients[MAX_CLIENTS];
void broadcast_message(char* message, int num_clients) {
for (int i = 0; i < num_clients; ++i) {
send(clients[i].socket_fd, message, strlen(message), 0); // 将消息发送到所有客户端
}
}
void handle_client(int client_socket) {
char buffer[BUFFER_SIZE], username[64];
memset(buffer, 0, sizeof(buffer));
// 接收用户名
while (fgets(buffer, sizeof(buffer), stdin)) {
if (strlen(buffer) > 0 && buffer[strlen(buffer)-1] == '\n') {
strncpy(username, buffer, strlen(buffer)-1); // 去除换行符
break;
}
}
// 将用户名存储到客户端结构体中
for (int i = 0; i < MAX_CLIENTS; ++i) {
if (clients[i].socket_fd == -1) {
clients[i].socket_fd = client_socket;
strcpy(clients[i].username, username);
break;
}
}
// 接收和广播消息
while (true) {
bzero(buffer, BUFFER_SIZE);
read(client_socket, buffer, BUFFER_SIZE);
broadcast_message(buffer, MAX_CLIENTS);
}
}
int main() {
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("Failed to create socket");
exit(EXIT_FAILURE);
}
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr));
listen(server_socket, 5);
printf("Server listening on port %d...\n", PORT);
while (true) {
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &addr_len);
if (client_socket != -1) {
printf("Accepted connection from %s:%d\n",
inet_ntoa(client_addr.sin_addr),
ntohs(client_addr.sin_port));
pthread_t thread;
pthread_create(&thread, NULL, handle_client, (void*)client_socket);
}
}
close(server_socket);
return 0;
}
```
在这个例子中,当新客户端连接时,服务器会启动一个新的线程来处理客户端的消息。每个客户端都需要先输入用户名,然后就可以发送任意长度的消息给服务器,服务器会将接收到的消息广播给所有在线客户端。
阅读全文