基于UDP的网络聊天室

客户端

#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)) ==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值