`
envy2002
  • 浏览: 149297 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

linux 聊天室 一对多

阅读更多

 

 

 

把上个版本一对一的聊天室,修改了一下,使其能进行一(server)对多(client)的聊天。

直接上源码:

 

 

/*
 provide the function to log.
 input: environment varibles, (1) LEVEL=DEBUG||WARNING||ERROE (2)LOGPATH(the log file saving path)
 output: different level log file
*/
#ifndef  _LOG_H_
#define  _LOG_H_

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <time.h>


//define the debug level
#define  DEBUG 5
#define  WARNNING 4
#define  ERROR 3
#define  WORKKING 1
//if return 0,means ok, !=0, means not ok.
int mylog(char * optional_msg,char * msg, int level);	

#endif

 

    #include "log.h"

int mylog(char * optional_msg,char * msg, int level)
{
	char * pc_level=getenv("LEVEL");
	char * pc_path =getenv("LOGPATH");
	
	//configure debug level
	if(pc_level==NULL)	
	{	
		pc_level="WORKKING";
	}
	//printf("current level is  %s\n",pc_level);
		
	//configure path	
	char path[256];
	if(pc_path==NULL)
	{		
		getcwd(path, sizeof(path));
		//printf("current path is %s\n",path);
		pc_path=path;	
				
	}
	
	//printf("configured path is %s\n",pc_path);	
	
	int int_src=0;
	char *pc_preLog;
	if(strcmp(pc_level,"DEBUG")==0)
	{	
		int_src=5;
	  	pc_preLog="[DEBUG]  ";
	}
	if(strcmp(pc_level,"WARNNING")==0)
	{
		int_src=4;
		pc_preLog="[WARNNING]  ";
	}
	if(strcmp(pc_level,"ERROR")==0)
	{
		int_src=3;
		pc_preLog="[ERROR]  ";
	}
	if(strcmp(pc_level,"WORKKING")==0)
	{
		int_src=1;
		pc_preLog="[WORKKING]  ";
	}
	
	//create a file to write log.	
	char target_path[400];
	strcpy(target_path,pc_path);
	strcat(target_path,"/log.txt");
	//printf("target path is %s\n",target_path);
	
	
	if(int_src>=level)
	{
		int fileid=open(target_path,O_WRONLY|O_APPEND|O_CREAT,0);
		if(fileid<0)
		{
			printf("create log file failed!\n");
			exit(0);	
		}
		write(fileid,optional_msg,strlen(optional_msg));
		write(fileid,pc_preLog,strlen(pc_preLog));
		write(fileid,msg,strlen(msg));
		//set time
		time_t timep;
        time (&timep);
        write(fileid,"   ----",strlen("   ----"));
        write(fileid,ctime(&timep),strlen(ctime(&timep)));
        
		write(fileid,"  \n",strlen("  \n"));
		close(fileid);
    }
	return 0;
}  



 

 

#ifndef _LIST_H_
#define   _LIST_H_
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct List 
{
	int *p_buffer;
	int *p_begin;
	int *p_end;
	int *p_cursor;
		
};
// you must add struct, otherwise it will prompt "expected ‘)’ before ‘*’ token"
void init(struct List * p_list);
int get_buffer_length (struct List * p_list);
int put_into_buffer(struct List* p_list,int p_number);
void delete_from_buffer(struct List* p_list, int p_number);
#endif
 

 

#include "List.h"


void init(struct List * p_list)
{
	int *p_temp=malloc(10*sizeof(10));
	p_list->p_buffer=p_temp;
	p_list->p_begin=p_temp;
	p_list->p_end=p_list->p_begin+9;
	p_list->p_cursor=p_list->p_begin;
	
}
int get_buffer_length (struct List * p_list)
{
     return p_list->p_cursor-p_list->p_begin;	
}

// return 0:OK,1:false
int put_into_buffer(struct List * p_list,int p_number)
{
	
	printf("before put  ");
	int m=0;
	for(;m<10;m++)
	{
		int shuzi=*(p_list->p_begin+m);
		printf("%d ",shuzi);
		
	}
	printf("\n");
	if(p_list->p_cursor>p_list->p_end)
	{
			printf("buffer is full, put into buffer error\n");
			return 1;			
	}
	   *p_list->p_cursor=p_number;
		p_list->p_cursor++;	
		
	printf("after put  ");	
	int n=0;
	for(;n<10;n++)
	{
		int shuzi=*(p_list->p_begin+n);
		printf("%d ",shuzi);
		
	}
	printf("\n");
		
	return 0;
}


void  delete_from_buffer(struct List* p_list, int p_number)
{
	
    printf("before delete  ");
	int m=0;
	for(;m<10;m++)
	{
		int shuzi=*(p_list->p_begin+m);
		printf("%d ",shuzi);
		
	}
	printf("\n");
	int length=get_buffer_length(p_list);
	
	printf("length is %d\n",length);
	int i=0;
	int * biao;
	for(;i<length;i++)
	{
		if(*(p_list->p_begin+i)==p_number)
		  { 
		  	biao=p_list->p_begin+i;
		  	break;
		  }
		
	}
	printf("i is %d\n",i);
	if(i<length)
	{
		bcopy(biao+1,biao,sizeof(int)*(length-(i+1)));
		memset(p_list->p_begin+(length-1),'\0',sizeof(int)*1);
	
		p_list->p_cursor--;
    }
	
	
	printf("after delete  ");	
	int n=0;
	for(;n<10;n++)
	{
		int shuzi=*(p_list->p_begin+n);
		printf("%d ",shuzi);
		
	}
	printf("\n");
}
 

  #include "log.h"

#include "List.h"
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <signal.h>


#define BUFFER_SIZE 256
//gloable variables
 struct List list;



void * receiveMsg(void * args)
{
	int *p_client_socket_id=(int *)args;
	int client_socket_id=*p_client_socket_id;
	while(1)
	{	
		char buffer[BUFFER_SIZE]={0};
	    mylog("[Server] ","before receive.....",DEBUG);
		int recv_length=recv(client_socket_id,buffer,BUFFER_SIZE,0);
		mylog("[Server] ","after receive.....",DEBUG);
		if (recv_length <= 0)
	    {
	          mylog("[Server] ","error comes when recieve data from server!",DEBUG);
	          delete_from_buffer(&list,client_socket_id);	          
	          if(get_buffer_length(&list)==0)
	          	exit(0);
	          break;
	    }
	    
	    printf("from server:%s\n",buffer);
    }
	
	return NULL;
}

void closeSocket()
{
	mylog("[Server] "," positively close connection socket",DEBUG);
	int i=0;
	for(;i<get_buffer_length(&list);i++)
	{
		int socketid=list.p_buffer[i];
		close(socketid);
	}
	free(list.p_buffer);
	exit(0);	
}

void *sendMsg(void *arg)
{
	while(1)
	{	
		char msg[BUFFER_SIZE];
		//scanf("%[^n]",msg);
		fgets(msg,BUFFER_SIZE,stdin);	
        int i=0;
        for(;i<get_buffer_length(&list);i++)
        {
        	int target_socket_id=*(list.p_begin+i);
			int length_send=send(target_socket_id,msg,BUFFER_SIZE,0);
			//printf("send msg length is %d\n",length_send);
			if(length_send<0)
				printf("send worry\n");	
		}	
	}
}

int main(int argc, char ** argv)
{

  
   init(&list);
//setup the sigint
    signal(SIGINT,closeSocket);
    
	struct sockaddr_in server_addr,client_addr;
	int size_of_addr=sizeof(server_addr);
	//printf("size of addr is %d\n",size_of_addr);
	
	//init server_addr;
	bzero(&server_addr,sizeof(server_addr));
	server_addr.sin_family=AF_INET;
	server_addr.sin_port=htons(9999);
	server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
	char * pc;
	pc=inet_ntoa(server_addr.sin_addr);
	//printf("server11 ip is %s\n",pc);
	
	int socketid=0;
	
	//create socket file
	mylog("[Server] ","before create socket......",DEBUG);
	if((socketid=socket(AF_INET,SOCK_STREAM,0))<0)
		mylog("[Server] ","create socket error",DEBUG);
	mylog("[Server] ","after create socket......",DEBUG);	
	//bind
	if(bind(socketid,(struct sockaddr*)&server_addr,size_of_addr)<0)
		mylog("[Server] ","bind server address error",DEBUG);
	
	//listen
    mylog("[Server] ","before listen......",DEBUG);
    
	if(listen(socketid,10)<0)
		mylog("[Server] ","listen error",DEBUG);
		
	mylog("[Server] ","after listen......",DEBUG);	
	

	socklen_t client_length=sizeof(client_addr);
	mylog("[Server] ","before accept......",DEBUG);
	while(1)
	{
		int client_socket_id=accept(socketid,(struct sockaddr*)&client_addr,&client_length);
		mylog("[Server] ","after accept......",DEBUG);
		if(client_socket_id<0)
			mylog("[Server] "," client socket file id is negetive, worry",DEBUG);
			
		//set receive thead
		pthread_t pthread_id;
		pthread_id=pthread_create(&pthread_id,NULL,	receiveMsg,(void *)&client_socket_id);
		
		char *pcwelcome="welcome\n";
		int length_string=strlen(pcwelcome);
		send(client_socket_id,pcwelcome,length_string,0);
		put_into_buffer(&list,client_socket_id);
		
		//set send thread
		pthread_t send_thread_id;
		send_thread_id=pthread_create(&send_thread_id,NULL,	sendMsg,NULL);
    }
	while(1)
	{	
		char msg[BUFFER_SIZE];
		//scanf("%[^n]",msg);
		fgets(msg,BUFFER_SIZE,stdin);	
        int i=0;
        for(;i<get_buffer_length(&list);i++)
        {
        	int target_socket_id=*(list.p_begin+i);
			int length_send=send(target_socket_id,msg,BUFFER_SIZE,0);
			//printf("send msg length is %d\n",length_send);
			if(length_send<0)
				printf("send worry\n");	
		}	
	}
	//close(client_socket_id);
	return 0;
}

   #include <stdio.h>

#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <signal.h>
#include "log.h"


#define BUFFER_SIZE 256

int socketid=0;
int client_result=0;
void * receiveMsg(void * args)
{
	while(1)
	{	
		if(client_result<0)
		{
			mylog("[Client] ","no connection",DEBUG);
			exit(0);	
		}
		char buffer[BUFFER_SIZE]={0};
	    mylog("[Client] ","before receive.....",DEBUG);
		int recv_length=recv(socketid,buffer,BUFFER_SIZE,0);
		mylog("[Client] ","after receive.....",DEBUG);
		if (recv_length <= 0)
	    {
	          mylog("[Client] ","error comes when recieve data from server!",DEBUG);
	          exit(0);
	         
	    }
	    
	    printf("from server:%s\n",buffer);
    }
	
	
}

void closeSocket()
{
	printf(" positively close connection socket\n");
	close(socketid);
	exit(0);	
}


int main(int argc, char ** argv)
{
	//setup the sigint
    signal(SIGINT,closeSocket);
    
	struct sockaddr_in server_addr,client_addr;
	int size_of_addr=sizeof(server_addr);
	//printf("size of addr is %d\n",size_of_addr);
	
	//init server_addr;
	bzero(&server_addr,sizeof(client_addr));
	client_addr.sin_family=AF_INET;
	//char* pc_port=argv[1];
	//printf("argv[1]   %s\n",pc_port);
	//int int_port=atoi(pc_port);
	//printf("int_port   %d\n",int_port);
	client_addr.sin_port=htons(9998);
	client_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
	char * pc;
	pc=inet_ntoa(client_addr.sin_addr);
	//printf("server ip is %s\n",pc);
	
	
	
	//create socket file
	if((socketid=socket(AF_INET,SOCK_STREAM,0))<0)
		mylog("[Client] ","create socket error",DEBUG);
		
	//bind
	if(bind(socketid,(struct sockaddr*)&client_addr,size_of_addr)<0)
	{	
		mylog("[Client] ","bind server address error",DEBUG);
		exit(0);
	}
	
	server_addr.sin_family=AF_INET;
	server_addr.sin_port=htons(9999);
	server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");	
	
	socklen_t server_length=sizeof(server_addr);
	client_result=connect(socketid,(struct sockaddr*)&server_addr,server_length);
	
	if(client_result<0)
		printf("connect failed\n");
		
	//set receive thead
	pthread_t pthread_id;
	pthread_id=pthread_create(&pthread_id,NULL,	receiveMsg,NULL);
	
	while(1)
	{	
		char msg[BUFFER_SIZE]={0};
		fgets(msg,BUFFER_SIZE,stdin);
		int messageLength=strlen(msg);
		//printf("message Length is %d\n",messageLength);
		int length_send=send(socketid,msg,messageLength,0);
		//printf("send msg length is %d\n",length_send);
		if(length_send<0)
			mylog("[Client] ","send worry",DEBUG);	
    }
    close(socketid);
	return 0;
	
}

    #include <stdio.h>

#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <signal.h>
#include "log.h"


#define BUFFER_SIZE 256

int socketid=0;
int client_result=0;
void * receiveMsg(void * args)
{
	while(1)
	{	
		if(client_result<0)
		{
			mylog("[Client] ","no connection",DEBUG);
			exit(0);	
		}
		char buffer[BUFFER_SIZE]={0};
	    mylog("[Client] ","before receive.....",DEBUG);
		int recv_length=recv(socketid,buffer,BUFFER_SIZE,0);
		mylog("[Client] ","after receive.....",DEBUG);
		if (recv_length <= 0)
	    {
	          mylog("[Client] ","error comes when recieve data from server!",DEBUG);
	          exit(0);
	         
	    }
	    
	    printf("from server:%s\n",buffer);
    }
	
	
}

void closeSocket()
{
	printf(" positively close connection socket\n");
	close(socketid);
	exit(0);	
}


int main(int argc, char ** argv)
{
	//setup the sigint
    signal(SIGINT,closeSocket);
    
	struct sockaddr_in server_addr,client_addr;
	int size_of_addr=sizeof(server_addr);
	//printf("size of addr is %d\n",size_of_addr);
	
	//init server_addr;
	bzero(&server_addr,sizeof(client_addr));
	client_addr.sin_family=AF_INET;
	//char* pc_port=argv[1];
	//printf("argv[1]   %s\n",pc_port);
	//int int_port=atoi(pc_port);
	//printf("int_port   %d\n",int_port);
	client_addr.sin_port=htons(9997);
	client_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
	char * pc;
	pc=inet_ntoa(client_addr.sin_addr);
	//printf("server ip is %s\n",pc);
	
	
	
	//create socket file
	if((socketid=socket(AF_INET,SOCK_STREAM,0))<0)
		mylog("[Client] ","create socket error",DEBUG);
		
	//bind
	if(bind(socketid,(struct sockaddr*)&client_addr,size_of_addr)<0)
	{	
		mylog("[Client] ","bind server address error",DEBUG);
		exit(0);
	}
	
	server_addr.sin_family=AF_INET;
	server_addr.sin_port=htons(9999);
	server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");	
	
	socklen_t server_length=sizeof(server_addr);
	client_result=connect(socketid,(struct sockaddr*)&server_addr,server_length);
	
	if(client_result<0)
		printf("connect failed\n");
		
	//set receive thead
	pthread_t pthread_id;
	pthread_id=pthread_create(&pthread_id,NULL,	receiveMsg,NULL);
	
	while(1)
	{	
		char msg[BUFFER_SIZE]={0};
		fgets(msg,BUFFER_SIZE,stdin);
		int messageLength=strlen(msg);
		//printf("message Length is %d\n",messageLength);
		int length_send=send(socketid,msg,messageLength,0);
		//printf("send msg length is %d\n",length_send);
		if(length_send<0)
			mylog("[Client] ","send worry",DEBUG);	
    }
    close(socketid);
	return 0;
	
}

其中client.c和client2.c就是bind的端口不同而已,因为前期设计有问题,所以就用这个蠢办法来验证,这不是一个好的设计和实现。

分享到:
评论

相关推荐

    linux系统下实现聊天室

    linux系统下实现聊天室 (1)在Linux系统下,使用TCP协议套接字编程; (2)服务器应具有处理多个客户端连接能力(设定最大连接数,如5个); (3)具有群发和私聊的能力; (4)过程描述

    linux下的简易聊天室

    本资源是基于linux下的一个简易聊天室,有注册、登陆、一对一私聊,一对多群聊功能。涉及到的知识点有linux基本知识,C语言,sqlite的基本操作,基本数据结构,Socket套接字

    Linux下C实现的聊天室.rar

    实现目标 一个在Linux下可以使用的聊天...5. Client段增加某些常用话语,可以对其中某些部分进行”姓名替换”,例如,输入/ClientA/welcome,则会自动发送”ClientA 大侠,欢迎你来到咱们的聊天室” 附加功能: 文件传输

    chatting_Linux.rar_Linux 聊天_express4dm_linux聊天室

    基于Linux聊天室,能够支持一对一和一对多聊天,支持文件传输等功能。

    Linux下用C语言基于消息队列编写多人聊天室

    Linux 环境下利用消息队列消息机制,多线程通信,字符串处理,链表操作,信号简单处理等知识用C语言编写多人聊天室实现: 服务器实现各用户之间聊天的消息转发,在用户注册或者登录时对各用户进行消息提醒,客户端从...

    亲测可用基于Linux消息队列的简易聊天室(C语言).zip

    亲测可用的基于Linux消息队列的简易聊天室(C语言)(附源代码)采用客户-服务器结构,其中服务器实现各个用户的登录并存储相关信息,客户端通过服务器端获取当前登录用户信息,然后各客户进程通过消息队列实现双向通信...

    Linux C聊天室项目【源码】+【说明文档】

    (2)一对多聊天: 【1】client端发送欲发送的信息给server端。 【2】server端遍历在线人信息链表,找到每个在线人的套接字描述符,将消息发送给链表中的每个人。 【3】可以通过输入“:)”, “:(”, “bye”来...

    C/S多人聊天室

    本代码实现模拟扣扣聊天室。 开发环境 : Linux,vim,gcc,gdb等 项目简述 : 使用socket网络编程及多线程程序设计开发多人聊天室,实现多客户端登录,室内群聊及一对一私聊。

    linux聊天系统

    linux下用C语言编写的tcp/ip协议的scoket网络编程项目,聊天系统可以实现一对一,一对多聊天,隐身,在线好友,显示时间等

    基于Linux消息队列的简易聊天室(C语言)(附源代码)

    Linux IPC通信利用消息队列消息机制,多线程通信,字符串处理,链表操作,信号简单处理。消息队列是System V支持一种IPC机制,通过类似链表的操作向一个FIFO里通过msgsnd发送用户自定义数据,进程可以通过msgrcv来...

    Java聊天室程序源码(毕业设计)

    Java聊天室程序源码 2 需求分析 2.1 业务需求 1. 与聊天室成员一起聊天。 2. 可以与聊天室成员私聊。 3. 可以改变聊天内容风格。 4. 用户注册(含头像)、登录。 5. 服务器监控聊天内容。 6. 服务器过滤非法内容。 7...

    网页视频聊天室软件zlchat v1.3.rar

    7. 管理员可以踢人,锁定聊天室,禁止视频,语音。 8. 性能优秀:每个房间最高可达100人,一台服务器最高可支持10000人同时在线 , 普通ADSL可以同时看10路用户视频。 9. 轻松与原有应用系统集成, 支持ASP, ASP...

    C语言基于socket多人聊天(包含注册登录)

    C语言基于socket多人聊天(包含注册登录),有注册和登录模块,验证通过才可以发信息。可实现多人同时在线发信息,或者一对一发信息

    Linux网络编程 视频 教程

    udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 ...

    springboot netty-socket-io免费聊天系统

    springboot netty-sockeit-io免费聊天系统,支持一对一,一对多,单独聊,私聊,群聊,开箱即用,支持图片、文件发送接收,支持windows、linux,支持pc端、手机端,支持ie8、firefox、chrome任意浏览器 自己安装...

    C++教程网《Linux网络编程》视频百度云地址

    udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 ...

    c++教程网的linux网络编程视频下载

    udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 ...

    starRTC,即时通讯(IM)系统,免费IM系统(含单聊,群聊,聊天室,文件传输.zip

    starRTC,即时通讯(IM)系统,免费IM系统(含单聊,群聊,聊天室,文件传输),免费一对一视频聊天,VOIP,语音对讲(回音消除),直播连麦,视频直播,RTSP拉流,RTMP推流,webRTC服务端,在线教育,白板,小班课,...

    linux网络编程

    udp聊天室实现 21socket编程(十六) UNIX域协议特点 UNIX域地址结构 UNIX域字节流回射客户/服务 UNIX域套接字编程注意点 22socket编程(十七) socketpair sendmsg/recvmsg UNIX域套接字传递描述符字 Linux网络编程...

    一个基于tornado+Mysql的基于WebSocketweb聊天室.zip

    此外,MySQL支持多种操作系统,包括Windows、Linux、macOS、Solaris等,确保了其在不同环境下的兼容性和部署灵活性。 关系型模型与SQL支持 MySQL基于关系型数据库模型,数据以表格形式组织,并通过预定义的键(如...

Global site tag (gtag.js) - Google Analytics