网络聊天室(TCP,多线程传输)实现

tech2026-02-04  13

server.c

#include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/socket.h> #include<netinet/in.h> #include<pthread.h> #include<arpa/inet.h> #define MAX_BUF 50 #define NAME 20 #define REMIND 50 typedef struct Users { char name[NAME]; int use_sock; pthread_t tid; struct sockaddr_in use_addr; }Users; Users user[MAX_BUF]; size_t user_count = 0; void* run(void* arg) { int use_sock = *(int *)arg; int index = 0; char buf[4096] = {}; size_t buf_size = sizeof(buf); for(int i=0;i<MAX_BUF;i++) { if(use_sock==user[i].use_sock) { index = i; break; } } recv(use_sock,buf,buf_size,0); strcpy(user[index].name,buf); sprintf(buf,"欢迎%s来到聊天室^.^",user[index].name); puts(buf); for(int i=0;i<MAX_BUF;i++) { if(0!=user[i].use_sock&&use_sock!=user[i].use_sock) { send(user[i].use_sock,buf,strlen(buf)+1,0); } } for(;;) { size_t rec_size = recv(use_sock,buf,buf_size,0); if(0==rec_size||0==strcmp("quit",buf)) { user[index].use_sock=0; close(use_sock); user_count--; sprintf(buf,"%s退出聊天室...",user[index].name); puts(buf); for(int i=0;i<MAX_BUF;i++) { if(0!=user[i].use_sock&&use_sock!=user[i].use_sock) { send(user[i].use_sock,buf,strlen(buf)+1,0); } } break; } for(int i=0;i<MAX_BUF;i++) { if(0!=user[i].use_sock&&use_sock!=user[i].use_sock) { send(user[i].use_sock,buf,strlen(buf)+1,0); } } } } int main() { printf("服务器连接中....\n"); int sockfd = socket(AF_INET,SOCK_STREAM,0); if(0>sockfd) { perror("socket"); return EXIT_FAILURE; } struct sockaddr_in addr = {},temp = {}; addr.sin_family = AF_INET; addr.sin_port = htons(8888); addr.sin_addr.s_addr = INADDR_ANY; socklen_t addrlen = sizeof(addr); if(bind(sockfd,(struct sockaddr*)&addr,addrlen)) { perror("bind"); return EXIT_FAILURE; } if(listen(sockfd,5)) { perror("listen"); return EXIT_FAILURE; } size_t index = 0; for(;;) { if(0==user[index].use_sock) { user[index].use_sock = accept(sockfd,(struct sockaddr*)&temp,&addrlen); if(0>user[index].use_sock) { perror("accept"); break; } pthread_t tid; user[index].tid = tid; pthread_create(&user[index].tid,NULL,run,&user[index].use_sock); user_count++; } else { if(user_count>=50) { printf("聊天室已满,请稍等!!!\n"); sleep(10); } index = (index+1)%50; } } }

client.c

#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <pthread.h> #define NAME 20 #define BUF_SIZE 4096 void* start_recv(void* arg) { int sockfd = *(int*)arg; char buf[BUF_SIZE] = {}; size_t buf_size = sizeof(buf); for(;;) { size_t rec_size = recv(sockfd,buf,buf_size,0); if(0==rec_size) { printf("服务器已断开!!\n"); return NULL; } printf("%s\n",buf); } } int main() { //创建套接字 int sockfd = socket(AF_INET,SOCK_STREAM,0); if(0 > sockfd) { perror("socket"); return EXIT_FAILURE; } //准备地址 struct sockaddr_in addr = {}; addr.sin_family = AF_INET; addr.sin_port = htons(8890); addr.sin_addr.s_addr = inet_addr("112.125.125.79"); socklen_t len = sizeof(addr); //连接 if(connect(sockfd,(struct sockaddr*)&addr,len)) { perror("connect"); return EXIT_FAILURE; } puts("***欢迎来到阿强聊天室***"); printf("请输入你的聊天名:"); char name[NAME] = {}; gets(name); //发送姓名 send(sockfd,name,strlen(name)+1,0); pthread_t pid; pthread_create(&pid,NULL,start_recv,&sockfd); char buf[BUF_SIZE] = {}; char buf2[BUF_SIZE] = {}; for(;;) { printf(">>>"); gets(buf); sprintf(buf2,"%s:%s",name,buf); size_t rec_size = send(sockfd,buf2,strlen(buf2)+1,0); if(0==rec_size||0 == strcmp("quit",buf)) { printf("***退出聊天室***\n"); close(sockfd); return 0; } } }
最新回复(0)