客户端
#include <myhead.h>
//定义存储信息结构体
typedef struct _MSG
{
char code; //操作码:'L'表示登录'C表示群聊'S'表示系统消息'S'表示退出
char name[128];
char txt[256];
}msg_t;
//定义保存客户端网络信息的链表
typedef struct _ADDR
{
struct sockaddr_in cin;
struct _ADDR* next;
}addrlist_t;
//登录操作的函数
void do_login(int sfd,msg_t msg,addrlist_t*addr,struct sockaddr_in cin)
{
//先遍历链表 将新用户加入群聊的消息发送给所有人
addrlist_t* tmp = addr; //记录链表头结点
while(tmp->next != NULL){
tmp = tmp->next;
if(sendto(sfd, &msg, sizeof(msg), 0, (struct sockaddr*)&(tmp->cin),sizeof(tmp->cin)) == -1){
perror("sendto error");
return;
}
}
//将新用户的网络信息结构体头插入链表
addrlist_t* pnew = NULL;
if(NULL == (pnew = (addrlist_t*)malloc(sizeof(addrlist_t)))){
printf("malloc error\n");
return;
}
pnew->cin = cin;
pnew->next = addr->next;
addr->next = pnew;
printf("%s已上线\n",msg.name);
return;
}
//群聊操作函数
void do_chat(int sfd,msg_t msg,addrlist_t*addr,struct sockaddr_in cin)
{
//遍历链表,将群聊消息发给除自己以外其他人
addrlist_t* ptmp = addr;
while(ptmp->next != NULL){
ptmp = ptmp->next;
if(memcmp(&cin, &(ptmp->cin), sizeof(cin))){
//说明不是自己就发送数据
if(sendto(sfd, &msg, sizeof(msg), 0, (struct sockaddr*)&(ptmp->cin),sizeof(ptmp->cin)) ==