项目需求:
用户登录注册
如果有用户登录,其他用户可以收到这个人的登录信息
如果有人发送信息,其他用户可以收到这个人的群聊信息
如果有人下线,其他用户可以收到这个人的下线信息
服务器可以发送系统信息
补充:若要加入系统踢人功能,则修改链表结构,将结点中的data的类型改为结构体类型,结构体存放的是客户端名称以及地址信息结构体
服务器:head.h function.c 01_udpSerChat.c
//head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#define ERR_MSG(msg) do{
\
fprintf(stderr, "line:%d ", __LINE__);\
perror(msg);\
}while(0)
#define PORT 6666 //1024~49151
#define IP "192.168.31.89" //IP地址,本机IP ifconfig
struct cli_msg
{
char type; //L C Q
char name[20];
char text[128];
};
typedef struct node
{
union{
int len;
struct sockaddr_in data;
};
struct node *next;
}*Linklist,Node;
//创建头结点
Linklist LinklistCreateHead();
//创建普通节点
Linklist LinklistCreateNode();
//头插
void Insert(Linklist l,struct sockaddr_in cin);
//按元素删除
int DeleteByData(Linklist l,struct sockaddr_in cin);
//按位置删除
void DeleteByPos(Linklist l,int pos);
int do_login(int sfd,Linklist l,struct cli_msg rcvbuf,struct sockaddr_in cin);
int do_chat(int sfd,Linklist l,struct cli_msg rcvbuf,struct sockaddr_in cin);
int do_quit(int sfd,Linklist l,struct cli_msg rcvbuf,struct sockaddr_in cin);
#endif
//function.c
#include "head.h"
int do_login(int sfd,Linklist l,struct cli_msg rcvbuf,struct sockaddr_in cin)
{
char sndbuf[128]="";
strcpy(sndbuf,rcvbuf.name);
strcat(sndbuf,"已经上线");
printf("%s\n",sndbuf);
//遍历链表,向其中成员发送新成员登录信息
if(l->next)
{
Linklist p = l->next;
while(p)
{
if(sendto(sfd,sndbuf,sizeof(sndbuf),0,(struct sockaddr *)(&(p->data)),sizeof(p->data))<0)
{
ERR_MSG("sendto");
return -1;
}
p=p->next;
}
}
//添加成员的地址信息
Insert(l,cin);
return 0;
}
int do_chat(int sfd,Linklist l,struct cli_msg rcvbuf,struct sockaddr_in cin)
{
//转发信息
char text[128]="";
strcpy(text,rcvbuf.name);
strcat(text,": ");
strcat(text,rcvbuf.text);
Linklist p = l->next;
while(p)
{
if(sendto(sfd,text,sizeof(text),0,(struct sockaddr *)(&(p->data)),sizeof(p->data))<0)
{
ERR_MSG("sendto");
return -1;
}
p