在Linux下实现聊天室,并给出代码
时间: 2024-02-18 17:59:51 浏览: 18
好的,这是一个简单的 Linux 聊天室的实现,使用 C 语言编写。它使用了 socket 编程库和多线程来实现多用户聊天,每个用户都可以发送消息给其他用户。
代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#define PORT 8080
#define MAX_CLIENTS 10
int clients[MAX_CLIENTS];
int next_client = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *handle_client(void *arg) {
int client_sock = *((int *) arg);
char buffer[1024];
int read_size;
while ((read_size = recv(client_sock, buffer, sizeof(buffer), 0)) > 0) {
buffer[read_size] = '\0';
pthread_mutex_lock(&mutex);
for (int i = 0; i < next_client; i++) {
if (clients[i] != client_sock) {
send(clients[i], buffer, strlen(buffer), 0);
}
}
pthread_mutex_unlock(&mutex);
}
pthread_mutex_lock(&mutex);
for (int i = 0; i < next_client; i++) {
if (clients[i] == client_sock) {
while (i < next_client - 1) {
clients[i] = clients[i+1];
i++;
}
next_client--;
break;
}
}
pthread_mutex_unlock(&mutex);
close(client_sock);
return NULL;
}
int main(int argc, char *argv[]) {
int server_sock, client_sock;
struct sockaddr_in server_addr, client_addr;
pthread_t threads[MAX_CLIENTS];
server_sock = socket(AF_INET, SOCK_STREAM, 0);
if (server_sock == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
if (bind(server_sock, (struct sockaddr *) &server_addr, sizeof(server_addr)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
if (listen(server_sock, 10) == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Server started on port %d\n", PORT);
while (1) {
socklen_t client_size = sizeof(client_addr);
client_sock = accept(server_sock, (struct sockaddr *) &client_addr, &client_size);
if (client_sock == -1) {
perror("accept");
continue;
}
pthread_mutex_lock(&mutex);
clients[next_client++] = client_sock;
pthread_mutex_unlock(&mutex);
pthread_create(&threads[next_client-1], NULL, handle_client, &client_sock);
}
return 0;
}
```
以上代码使用了一个 `clients` 数组来存储已连接的客户端的 socket 描述符,`next_client` 记录下一个可用的位置。在客户端连接时,新的 socket 描述符被添加到数组中。在客户端关闭连接时,该 socket 描述符从数组中删除。
`handle_client` 函数是每个客户端连接的处理器。它使用 `pthread_mutex_lock` 和 `pthread_mutex_unlock` 来保护共享资源,即 `clients` 数组。它接收客户端发来的消息,并将其转发给其他客户端。
在主函数中,服务器创建一个 socket 并绑定到指定的端口。然后,它侦听新的客户端连接并将其接受。对于每个连接,它启动一个新线程来处理客户端消息。
这只是一个简单的实现,可以根据需要进行修改和扩展。