udp创建多人模拟聊天室

客户端
chat.c

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<fcntl.h>
#include"../head.h"
void handler(int argc){
	while(waitpid(-1,NULL,WNOHANG)>0);
	exit(0);
}
int main(int argc, const char *argv[])
{
	signal(17,handler);
	int usfd = socket(AF_INET,SOCK_DGRAM,0);
	if(usfd<0)
	{
		perror("socket");
		return -1;
	}
	struct sockaddr_in cin;
	cin.sin_family = AF_INET;
	cin.sin_port = htons(1025);
	cin.sin_addr.s_addr= inet_addr("192.168.8.102");
	socklen_t sizeodcin=sizeof(cin);
	char buf[128]="";
	char login[10]="";
	printf("please input login\n");
	scanf("%s",login);
	if(!strcmp(login,"login")){
		char name[20]="";
		printf("please input name\n");
		scanf("%s",name);
		int size = sprintf(buf,"%s%s",login,name);
		sendto(usfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeodcin);
		pid_t cid = fork();
		if(cid==0){
			while (1)
			{
				bzero(buf,sizeof(buf));
				scanf("%s",buf);
				sendto(usfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeodcin);
				if(!strcmp(buf,"quit")){
					break;
				}
			}
			exit(0);
		}else if(cid>0){
			while (1)
			{
				recvfrom(usfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&sizeodcin);
				printf("%s\n",buf);
			}
		}else{
			perror("fork");
		}
	}else{
		printf("login error\n");
	}
	close(usfd);
	return 0;
}

服务器端
chats.c

#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<fcntl.h>
#include"../head.h"
typedef struct node{
	union{
		struct sockaddr_in cin;
		int len;
	};
	struct node *next;
}*linksock;
linksock create_space(int flag)
{
	linksock ls=(linksock)malloc(sizeof(struct node));
	if(NULL==ls)
	{
		return NULL;
	}
	if(1==flag)
	{
		ls->len=0;
	}else{
		ls->cin.sin_family=AF_INET;
		ls->cin.sin_port = htons(0);
		ls->cin.sin_addr.s_addr = inet_addr("192.168.8.102");
	}
	ls->next=NULL;
	return ls;
}
void add_link(linksock L,int port){
	linksock q=L;
	int flag=0;
	while(q->next)
	{
		q=q->next;
		if(q->cin.sin_port == htons(port)){
			flag++;
		}
	}
	if(0==flag){
		linksock s=create_space(0);
		if(NULL==s)
			return ;
		s->cin.sin_port = htons(port);
		q->next=s;
		L->len++;
	}
}
int main(int argc, const char *argv[])
{
	int usfd = socket(AF_INET,SOCK_DGRAM,0);
	if(usfd<0)
	{
		perror("socket");
		return -1;
	}
	linksock L =create_space(1);
	struct sockaddr_in cin;
	cin.sin_family = AF_INET;
	cin.sin_port = htons(1025);
	cin.sin_addr.s_addr= inet_addr("192.168.8.102");
	socklen_t sizeodcin=sizeof(cin);
	char buf[128]="";
	while (1)
	{
		bind(usfd,(struct sockaddr*)&cin,sizeodcin);
		recvfrom(usfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&sizeodcin);
		if(1025!=ntohs(cin.sin_port)){
			add_link(L,ntohs(cin.sin_port));
		}
		if(!strcmp(buf,"quit"))
		{
			linksock s=L;
			while(s->next)
			{
				if(s->next->cin.sin_port==cin.sin_port){
					linksock ss=s->next;
					s->next=ss->next;
					break;
				}
				s=s->next;
			}
			free(ss);
			ss=NULL;
			L->len--;
		}
		linksock q=L;
		while(q->next)
		{
			q=q->next;
			sendto(usfd,buf,sizeof(buf),0,(struct sockaddr*)&q->cin,sizeodcin);
			//printf("%s\n",buf);
		}
	}
	close(usfd);
	return 0;
}

头文件集
head.h

#ifndef __HEAD_H__
#define __HEAD_H__
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<string.h>
#include<sys/ipc.h>
#include<wait.h>
#include<fcntl.h>
#include<unistd.h>
#include<time.h>
#include<dirent.h>
#include<pthread.h>
#include<stdlib.h>
#include<sys/sem.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<fcntl.h>
#include<unistd.h>
#define SERVER_PORT 8800
#define SERVER_IP "192.168.8.101"
#define IP_ADDR "192.168.8.102"
#define PORT 5201
#define NUM 10
#define ERR_MSG(msg) do{\
	printf("line=%d\n",__LINE__);\
	perror(msg);\
}while(0)
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值