linux多人聊天程序 linux多人聊天程序,自己写的,大家可以支持下,我测试的时候没有bug,大家测试有bug可以联系下我,谢谢支持 使用多线程实现自由聊天 也可以直接下载 server.c client.c
一、设计思路
客户端:负责维护一个结构体数组,储存客户端在线人数情况,同时向客户端发送在线人数列表。
客户端:与其它客户端聊天,请求在线人数列表二代码展示
https://download.csdn.net/download/weixin_43501074/12519926
char.h/* * char.h * * Created on: 2020年5月22日 * Author: wu */ #ifndef CHAR_H_ #define CHAR_H_ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/msg.h> #include <sys/sem.h> #include <string.h> #include <signal.h> #include <pthread.h> typedef struct{ pid_t pid; char name[64]; int used;//0free 1sued }client_t; #define zd 64 typedef struct{ pid_t pid; char name[64]; char text[1024];;//0free 1sued }tx_t; typedef struct{ long type; tx_t tx; }tx_msg; #define tx_sise (sizeof(tx_msg)-sizeof(long)) #define server_key 0x3330001 #define xx_key 0x3330002 typedef struct{ long type; #define server_login 0x01 #define server_out 0x02 #define server_list 0x03 union{ client_t client; client_t clients[zd]; }data; }server_msg; #define server_sise (sizeof(server_msg)-sizeof(long)) #endif /* CHAR_H_ */
/* * server.c * * Created on: 2020年5月22日 * Author: wu */ #include "char.h" static int msgid; static int msgtx; client_t clients[zd]; int add(pid_t pid,char *name) { int i; for(i=0;i<zd;i++) { if(clients[i].used==0) break; } if(i>=zd) return -1; clients[i].pid=pid; strncpy(clients[i].name,name,strlen(name)); clients[i].used=1; return 0; } int sub(pid_t pid) { int i; for(i=0;i<zd;i++) { if(clients[i].pid==pid) {clients[i].used=0; break;} } return 0; } void show() { printf("在线人数:n"); printf("t pid t namen"); int i; for(i=0;i<zd;i++) { if (clients[i].used==1) { printf("t %d t %sn",clients[i].pid,clients[i].name); } } } void list(pid_t pid) { server_msg msg; memset(&msg,0,sizeof(server_msg)); msg.type=pid; int i; for(i=0;i<zd;i++) { msg.data.clients[i].used=clients[i].used; msg.data.clients[i].pid=clients[i].pid; strncpy(msg.data.clients[i].name,clients[i].name,strlen(clients[i].name)); } for(i=0;i<zd;i++) { if (msg.data.clients[i].used==1) { printf("t %d t %sn",msg.data.clients[i].pid,msg.data.clients[i].name); } } msgsnd(msgid,&msg,server_sise,0); } int main(int argc, char **argv) { msgtx=msgget(xx_key,IPC_CREAT|0666); msgid=msgget(server_key,IPC_CREAT|0666); server_msg msg; while(1){ memset(&msg,0,sizeof(server_msg)); msgrcv(msgid,&msg,server_sise,-server_list,0); if (msg.type==server_login) { add(msg.data.client.pid,msg.data.client.name); show(); } else if (msg.type==server_out) { sub(msg.data.client.pid); show(); } else if (msg.type==server_list){ printf("%dn",msg.data.client.pid); list(msg.data.client.pid); printf("%dn",msg.data.client.pid); } } return 0; }
/* * client.c * * Created on: 2020年5月23日 * Author: wu */ #include "char.h" static int msgid; static int msgtx; client_t clients[zd]; int _pid; void login(void) { printf("请输入用户名"); char _name[64]={0}; fgets(_name,64,stdin); _pid=getpid(); server_msg msg; memset(&msg,0,sizeof(server_msg)); msg.type=server_login; msg.data.client.pid=_pid; strncpy(msg.data.client.name,_name,strlen(_name)); msgsnd(msgid,&msg,server_sise,0); } void out(void) { server_msg msg; memset(&msg,0,sizeof(server_msg)); msg.type=server_out; msg.data.client.pid=getpid(); msgsnd(msgid,&msg,server_sise,0); } void show() { printf("在线人数:n"); printf("t pid t namen"); int i; for(i=0;i<zd;i++) { if (clients[i].used==1) { printf("t %d t %sn",clients[i].pid,clients[i].name); } } } void list() { server_msg msg; memset(&msg,0,sizeof(server_msg)); msg.type=server_list; msg.data.client.pid=_pid; msgsnd(msgid,&msg,server_sise,0); while(1){ memset(&msg,0,sizeof(server_msg)); msgrcv(msgid,&msg,server_sise,_pid,0); if (msg.type==_pid) { int i; for(i=0;i<zd;i++) { clients[i].used=msg.data.clients[i].used; clients[i].pid=msg.data.clients[i].pid; strncpy(clients[i].name,msg.data.clients[i].name,strlen(msg.data.clients[i].name)); } show(); break; } } } void thread(void) { tx_msg txmsg; while(1) { memset(&txmsg,0,sizeof(tx_msg)); msgrcv(msgtx,&txmsg,tx_sise,_pid,0); if (txmsg.type==_pid) { printf("pidt namet textn"); printf("%dt%s:t%sn",txmsg.tx.pid,txmsg.tx.name,txmsg.tx.text); } } } void fs() { tx_msg txmsg; printf("请输入目标pid:"); int mbpid; scanf("%d",&mbpid); while(1){ memset(&txmsg,0,sizeof(tx_msg)); txmsg.tx.pid=_pid; int i; for(i=0;i<zd;i++) { if(clients[i].pid==_pid) {strncpy(txmsg.tx.name,clients[i].name,strlen(clients[i].name)); break;} } printf("请输入给%d发送的内容(esc退出):",mbpid); char _text[64]={0}; scanf("%s",_text); if(!strcmp(_text,"esc")) { printf("ts"); break; } txmsg.type=mbpid; strncpy(txmsg.tx.text,_text,strlen(_text)); msgsnd(msgtx,&txmsg,tx_sise,0); } } int main(int argc, char **argv) { pthread_t xcid; pthread_create(&xcid,NULL,(void *) thread,NULL); char ml[64]={0}; msgid=msgget(server_key,0); msgtx=msgget(xx_key,0); login(); printf("cmd:退出:quitn" " 在线列表:listn" " 聊天:maken"); while(strcmp(ml,"quit")) { scanf("%s",ml); printf("ts"); if(!strcmp(ml,"list")) { printf("ts"); list(); } else if(!strcmp(ml,"make")) { fs(); printf("ts");} } out();![在这里插入图片描述](https://img-blog.csdnimg.cn/20200613142017829.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUwMTA3NA==,size_16,color_FFFFFF,t_70#pic_center) return 0; }
三、运行截图
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算