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(); return 0; } 三、运行截图
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算
 官方软件产品操作指南 (170)
官方软件产品操作指南 (170)