C语言 基于UDP的局域网多人聊天室的简单代码

本文介绍了一个基于C语言和UDP协议的局域网多人聊天室项目。通过多线程处理接收和发送数据,利用链表存储用户信息,并详细列举了代码的组成部分,包括头文件、自定义函数接口、服务端和客户端代码。同时,作者指出代码存在的不足,如无字符溢出保护、用户重名问题、服务端退出机制不完善以及代码可读性差等问题。附有源码下载链接,期待同行指正。
摘要由CSDN通过智能技术生成

[C]基于UDP的局域网多人聊天室的简单代码 ..编程小白,代码可能比较冗长,请各位大佬指出不足 [*・ω・]

运行现象

1.当客户端(client)打开,输入昵称后服务器(server)端以及客户端的现象

服务器端会打印所登录客户端使用的ip信息和端口号,并给其他用户发送该用户的登录信息
2.当客户端发送消息,以及服务端发送消息,以及客户端退出时现象
客户端发送信息
客户端退出
服务端发送信息

思路

1.因为服务端和客户端都需要具备接收数据和发送数据的能力,因此需要使用多个线程分别完成接收和发送的操作(相关函数pthread_create())
2.因为需要通过服务端给每个用户群发消息,所以用户的信息需要储存,用数组和链表都可以,这里本人用的是链表
3.因为UDP协议发送信息时用的是sedto()函数,每次发送数据都需要提供发送目标的ip和端口号,因此我们需要定义一个结构体来存放每个登录用户的端口号和ip号等信息.

程序源码(LINUX)

1.head.h(头文件)

#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <stdlib.h>
#include <linux/in.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>

//发送信息的标志变量
#define LOGIN	0
#define QUIT	1
#define SESSION 2
#define SERVER	3
#define	RENAME	4

//存放客户端发送信息
typedef struct msg{
   
	int flag;
	char name[16];
	char info[64];
}msg;

//用来保存单个用户的ip,端口号等信息
typedef struct usermsg{
   
	char user_ip[32];
	unsigned short user_port;
	char user_name[16];
}usermsg;

//存放所有用户信息的链
typedef struct userlink{
   
	usermsg user;
	struct userlink *next;
}userlink;



int link_creat(userlink **);			//创建链表
int link_add(userlink *,usermsg *,int);	//添加用户
int myperror(int,char*);				//报错信息(写到后面忘了这个函数了,后面写的函数几乎都没有做判断...)
int link_delete(userlink*,usermsg*,int);//用户退出,删除退出用户的信息
int mass(userlink*,usermsg*,msg*,int);	//服务器给各个客户端群发信息的函数
void* client_thread(void*);				//客户端thread_create()创建线程函数的最后一个参数,该线程用于接收来自服务器的消息
userlink* link_select(userlink*,usermsg*);//查找指定用户的函数
void* clientmsg_thread(void *);			//服务端thread_create()创建线程函数的最后一个参数,该线程用于给客户端发送服务端的消息
void* servermsg_thread(void *);			//服务端thread_create()创建线程函数的最后一个参数,该线程用于给客户端发送其他客户端的消息
#endif

2.datalink.c (存放着各种自定义函数接口)

#include"head.h"
//自定义的报错函数
int myperror(int flag,char *name){
   
	if(flag < 0){
   
		printf(">>server : %s is error",name);
		perror(":");
		exit(-1);
		return 0;
	}else{
   
		printf(">>server : %s is succeed\n",name);
		return 0;
	}
}
//创建链表
int link_creat(userlink **p){
   
	if((*p) == NULL){
   
		(*p) = (userlink*)malloc(sizeof(userlink));
		(*p) -> next = NULL;
		(*p) -> user.user_port = 0;
		return 0;
	}
	puts("==SERVER== :link is exit");
	return 0;
}
//添加用户,并给所有人发送登录信息
int link_add(userlink *p,usermsg *umsg,int sockfd){
   
	if(p){
   
		userlink *new = (userlink*)malloc(
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值