c语言+linux终端聊天,基于c语言用消息队列去做一个简单聊天室

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define msg_ser 10

#define N 512

#define lenth (sizeof(my_msg_t))

typedef struct my_msg_s{

long mymsgtype;

char some_text[N];

int pid;

char name[20];

int bztype;

}my_msg_t;

typedef struct list

{

int type;

struct list *next;

}list,*linklist;

void send(linklist h,int msgid,my_msg_t *some_data)

{

int i;

for(i=0;i

{

some_data->mymsgtype=getvalue(h,i);

if(some_data->mymsgtype!=some_data->pid)

{

msgsnd(msgid,some_data,lenth,0);

}

}

}

linklist creatlist()

{

linklist h;

h=(linklist)malloc(sizeof(list));

h->next=NULL;

return h;

}

int getlenth(linklist h)

{

int n=0;

h=h->next;

while(h){

n++;

h=h->next;

}

return n;

}

int empty(linklist h)

{

if(NULL==h->next){return 1;}

else return 0;

}

int insert(linklist h,int x)

{

linklist p;

p=(linklist)malloc(sizeof(list));

p->type=x;p->next=NULL;

while(h->next)

{

h=h->next;

}

h->next=p;

return 0;

}

int delete(linklist h,int x)

{

linklist p=h->next;

while(p){

if(p->type==x){

h->next=p->next;

free(p);

p=h->next;

}

else{

h=p;p=h->next;

}

}

return 0;

}

int getvalue(linklist h,int y)

{

h=h->next;

while(y--){h=h->next;}

return h->type;

}

int main(int argc,char** argv)

{

char input1[3],input2[3];pid_t pid,pid2;

int msgid;

my_msg_t some_data;

msgid=msgget((key_t)3456,0666|IPC_CREAT);

if(msgid==-1)

{

fprintf(stderr,"msgget failed error:%d\n",errno);

exit(EXIT_FAILURE);

}

pid=fork();

if(pid<0) {printf("fork error");}

else if(pid==0)

{

pid2=getpid();

linklist h;h=creatlist();

while(1)

{

msgrcv(msgid,&some_data,lenth,msg_ser,0);

if(some_data.bztype==1)

{

insert(h,some_data.pid);

printf("name:%s id:%d online\n",some_data.name,some_data.pid);

send(h,msgid,&some_data);

}

if(some_data.bztype==2)

{

send(h,msgid,&some_data);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值