linux c udp 群聊程序,linux-c基于udp的多人聊天程序

62e50291a81fc54b507f33cb80033297.gif linux-c基于udp的多人聊天程序

(7页)

3d55c4831de5d23cfa1e66fbcc2f5213.gif

本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦!

9.9 积分

Client.C#incl ude#in clude#in cludevstri ng?h># include#in clude#in clude#in elude vnetinet/in.h>#in clude#in clude< un istd.h>#in clude#define N 128typedef struct{char type;char name[32];char text[N];}MSG;int main(int argc,char *argv[]){int socketfd;socklen t addr len;pid_t pid;MSG msg;struct sockaddrjn server_addr;if(argc < 3){printf(Huasge: %s ip port\n%rgv[0]);exit(-l);}if((socketfd = socket(PF」NET,SOCK_DGRAM,0)) < 0){perror(Msocket");exit(-l);}printf(ninput name:\nH);fgetsfmsg. name,64,stdi n);msg.name[strlen(msg.name) -1] =、0‘;msg.type=,L,;memset(&server_addr,0,sizeof(server_addr));server^addr.si n_family = AF」N ET;server_addr.si n_ addr.s_addr = in et_addr(argv[l]);server_addr.sin_port = hton s(atoi(argv[2]));addrje n = sizeof(server_addr);if(sendtofsocketfd,&msg,sizeof(msg),0‘(struct sockaddr*)&server_addr,addr_len) < 0) {perror(Hsendto3H);exit(-l);}if((pid = fork()) == -1){perrorCfork1');exit(-l);}iffpid == 0){while(l){fg ets(msg.text,N,stdin);msg.text[strlen(msg.text) -1] = *\0';iffstrncmpfmsg.text/'quitM) == 0){msg.type = Q;if(sendto(socketfd,&msEsizeof(msg),0’(struct sockaddr*)&server_addr,addr_len)<0)perror(”sendto2j; exit(-l);}kill(getppid(),SIGKILL); break;}elsemsg.type=,B,;if(sendto(socke廿d,&msg^izeoffmsgl^O^struct sockaddr*)&server_addr,addr_len)perror(Hse ndtol”);}}close(socketfd);}if(pid > 0){while(l){if(recvfrom(socketfd,&msg’sizeof(rnsg),0‘(struct sockaddr*)&server_addr,&addr_len)<0){perror(HrecvfromH);exit(-l);}switch(msg.type){case 1':printf("%s login\n舄msg.name);break;case 'B':printf(Hfrom %s> %s\n舄msg.name.msg.text);break;case Q:printf(u%s quit\n蔦msg.name);break;}}}return 0;}server.c#incl ude#in clude#include#incl ude#in clude#in clude#incl ude vnetin et/in.h>#in clude#in clude< un istd.h>#in clude#define N 128#define L 1#define B 2#define Q3typedef struct{char type;char name[32];char text[N];}MSG;typedef struct node{struct sockaddr_in addr;struct node *next;}listnode,*linklist;linklist linklist_create(){ _linklist H;H = (linklist)malloc(sizeof(listnode));memset(H,0,sizeof(list no de));H->next = NULL;return H;}void insert_data(linklist H,struct sockaddr_in dient_addr){ "linklist p = NULL;p =(lin klist)malloc(sizeof(listnode));p->addr = client_addr;p->next = H->next;H?>n ext = p;return;}void process」ogin(int socketfdjinklist H,MSG msg,struct sockaddrjn dient_addr)in sert_data(H,clie nt_addr);linklist hl = H;while(hl->next != NULL){hl = hl?>n ext;if(memcmp(&client_addr,&hl?>addr,sizeof(client_addr)) != 0 ){ " 一讦(sen dto(socketfd,&msgzsizeof(msg),Oz(structsockaddr*)&(hl->addr),sizeof(hl->addr)) < 0){perror(Hsendto4"); exit(-l);}}}return;}void process_broadcast(int socketfdjinklist H,MSG msg,struct sockaddr_in die nt_addr){"linklist hl = H;while(hl->next != NULL){hl = hl?>n ext;if(memcmp(&client_addr,&hl?>addr,sizeof(client_addr)) != 0){ " 一讦(sen dto(socketfd,&msgzsizeof(msg),Oz(structsockaddr*)&(hl->addr),sizeof(hl->addr)) < 0){perror(”sendto3“); exit(-l);}}}return;}void process_quit(int socketfdjinklist H,MSG msg,struct sockaddrjn dient_addr)linklist p = H; linklist q; while(p->n ext) if(memcmp(&clien t_addr,&p?>n ext->addr,sizeof(clie nt_addr)) == 0) { " "q = p?>n ext;p->n ext = q->next;free(q);q = NULL;}else{讦(sen dto(socke t:fcL&msg,sizeof(msg),Obstructsockaddr*)&p->next->addr,sizeof(p->next->addr)) < 0){perror(Hse ndto”);exit(-l);}p = p?>n ext;}}return;}int main(int argc,char *argv[]){int socketfd;socklen t addr len;pid_t pid;MSG msg;struct sockaddrjn server_addr,client_addr;if(argc < 3){printf(Huasge: %s ip port\n Jargv[0]);exit(-l);}memset(&server_addr\0’sizeof(server_addr)); server_addr.sin_family = AF」NET;server_addr.si n_ addr.s_addr = inet_addr(argv[l]); server_addr.si n_ port = hton s(atoi(argv[2])); if((socketfd = socket(PFJNET,SOCK_DGRAM,0)) < 0)perror(nsocketH); exit(-l);if(bind(socketfd,(struct sockaddr*)&server_addr,sizeof(server_addr)) < 0) {perrorC'bind");exit(-l);}addrjen = sizeof(client_addr);linklist H = linklist_create();if((pid = fork()) == -1){perror("fork");exit(-l);}if(pid == 0){while(l){fgets(msg.text,N,stdi n);msg.text[strlen(msg.text)-l] = '\0';strcpy(msg. name, "server”);msg.type = 'B';if(se ndto(socketfd,&msg,sizeof(msg),Obstruct sockaddr*)&server_addr,sizeof(server_addr)) < 0){" "perror(Hse ndtol”); close(socketfd); exit(-l);}else if(pid > 0){while(l){if(recvfrom(socketfd,&msg,sizeof(msg),0,(struct sockaddr*)&client_addr,&addrjen) < 0){" " perror("recvfromH); close(socketfd);exit(-l);} switch(msg.type)case V:process _login (socketfd,H,msg,client_addr); break;case 'B': process_broadcast(socke Hd’H’msg’clie nt_addr); break;case 'Q':process_quit(socke tfdHmsg’clie nt_addr); break;}}}return 0;}运行时须带两个参数 第一个是ip第二个是端口 关 键 词: linux 基于 udp 聊天 程序

524d6daf746efaa52c3c71bbfe7ba172.gif  天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值