基于c语言使用socket编程实现简易聊天室
时间: 2023-09-03 14:10:56 浏览: 80
实现简易聊天室需要以下步骤:
1. 创建服务器
使用socket函数创建服务器,使用bind函数将服务器绑定到指定的IP地址和端口号。使用listen函数监听客户端连接请求。
2. 接受客户端连接请求
使用accept函数接受客户端连接请求,创建一个新的套接字用于与客户端通信。
3. 接收和发送消息
使用recv函数接收客户端发送的消息,使用send函数将消息发送给客户端。
4. 处理多个客户端
使用多线程或多进程处理多个客户端连接请求,每个线程或进程处理一个客户端连接请求。
下面是一个简单的示例代码:
服务器端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <pthread.h>
#define MAX_CLIENTS 10
#define BUFFER_SIZE 1024
int clients[MAX_CLIENTS];
int num_clients = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *client_handler(void *arg)
{
int client_fd = *(int *)arg;
char buffer[BUFFER_SIZE];
int nbytes;
while ((nbytes = recv(client_fd, buffer, BUFFER_SIZE, 0)) > 0) {
buffer[nbytes] = '\0';
printf("Client[%d]: %s", client_fd, buffer);
pthread_mutex_lock(&mutex);
for (int i = 0; i < num_clients; i++) {
if (clients[i] != client_fd) {
send(clients[i], buffer, nbytes, 0);
}
}
pthread_mutex_unlock(&mutex);
}
pthread_mutex_lock(&mutex);
for (int i = 0; i < num_clients; i++) {
if (clients[i] == client_fd) {
for (int j = i; j < num_clients - 1; j++) {
clients[j] = clients[j + 1];
}
num_clients--;
break;
}
}
pthread_mutex_unlock(&mutex);
close(client_fd);
printf("Client[%d] exit\n", client_fd);
return NULL;
}
int main(int argc, char *argv[])
{
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len;
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(6666);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
if (listen(server_fd, MAX_CLIENTS) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("Server start listening on port %d...\n", ntohs(server_addr.sin_port));
while (1) {
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len);
if (client_fd < 0) {
perror("accept");
continue;
}
pthread_t tid;
pthread_create(&tid, NULL, client_handler, &client_fd);
pthread_detach(tid);
pthread_mutex_lock(&mutex);
clients[num_clients++] = client_fd;
pthread_mutex_unlock(&mutex);
printf("Client[%d] connected\n", client_fd);
}
close(server_fd);
return 0;
}
```
客户端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define BUFFER_SIZE 1024
int main(int argc, char *argv[])
{
int client_fd;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
int nbytes;
if (argc < 2) {
fprintf(stderr, "Usage: %s <server_ip_address>\n", argv[0]);
exit(EXIT_FAILURE);
}
client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
server_addr.sin_port = htons(6666);
if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("connect");
exit(EXIT_FAILURE);
}
while (1) {
fgets(buffer, BUFFER_SIZE, stdin);
nbytes = strlen(buffer);
send(client_fd, buffer, nbytes, 0);
}
close(client_fd);
return 0;
}
```
注意:上述代码仅为示例代码,没有做错误处理和安全性检查,请勿直接使用于生产环境。