`
envy2002
  • 浏览: 152734 次
  • 性别: 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下的聊天室涉及TCP套接字编程、多线程处理、I/O多路复用、网络通信协议理解以及编程技巧等多个方面,这些知识点是网络编程和系统级开发的基础,对理解互联网服务的运行机制至关重要。

    C++实现的Linux多线程聊天室

    本项目以C++语言在Linux环境下实现了一个多线程聊天室,利用了Linux系统强大的多线程支持和C++的高效编程能力。下面我们将详细探讨这一实现过程中的关键知识点。 首先,我们要理解多线程的概念。在单线程程序中,...

    Linux多人聊天室

    本项目名为"Linux多人聊天室",显然旨在创建一个基于Linux系统的多人在线交流平台。这个平台可能是一个命令行界面的应用,或者是通过Web浏览器访问的交互式聊天系统。下面将详细探讨实现这样一个聊天室涉及的关键...

    linux下的socket聊天室程序

    本项目"Linux下的socket聊天室程序"就是基于Socket编程实现的一个简单多用户交互平台。这个程序可以支持多个客户端同时连接到同一服务器,进行实时的文本聊天。 1. **Socket基础**:Socket是网络通信的基本单元,它...

    linux下实现简单的聊天室

    在Linux环境下,构建一个简单的聊天室是一个典型的网络编程任务,主要涉及到UDP(User Datagram Protocol)协议的应用。UDP是一种无连接的、不可靠的传输层协议,适合于对实时性要求较高但对数据完整性要求不那么...

    linux网络聊天室

    【Linux网络聊天室】是一个基于TCP网络通讯协议的命令行聊天工具,专为Linux系统设计。这个项目展示了网络编程的基本原理和C语言的应用,同时也涵盖了多用户交互与管理功能。 首先,TCP(传输控制协议)是互联网...

    聊天室 linux c udp

    在这个聊天室中,服务器创建一个UDP socket,监听特定端口,等待来自多个客户端的数据包。 4. **服务器端实现**:服务器端程序负责处理上线、下线提醒,以及群广播消息。当收到一个客户端的请求时,服务器不仅会回...

    基于Linux系统用java写的多人聊天室.zip

    在IT领域,开发一款基于Linux系统的多人聊天室是一项常见的挑战,这通常涉及到网络编程、多线程技术以及Java语言的应用。本项目名为“基于Linux系统用Java写的多人聊天室”,它不仅实现了基本的聊天功能,还包含了...

    linux多人聊天室程序(udp协议)

    在本文中,我们将深入探讨如何使用UDP(用户数据报协议)在Linux环境下构建一个多人聊天室程序。UDP是一种无连接的、不可靠的传输层协议,适用于需要快速发送数据但可以容忍丢失或乱序到达的场景,如在线游戏、视频...

    linux下的简单聊天室源代码(c语言实现)

    这个"linux下的简单聊天室源代码(c语言实现)"为初学者提供了一个基础的平台,了解如何在Linux上创建一个简单的多用户聊天应用。下面将详细阐述相关知识点。 1. **套接字(Sockets)编程**: 套接字是网络通信的...

    linux局域网多线程聊天室

    在Linux环境中,使用C语言开发一个局域网内的多线程聊天室是一项具有挑战性的任务。这个项目涉及到多个关键知识点,主要包括对C语言的基础理解、Linux系统编程、网络编程以及多线程编程,特别是pthread库的使用。...

    基于linux网络聊天室

    【基于Linux网络聊天室】是一个实现在线交流的平台,它具备了多种功能,旨在提供一个高效、便捷的沟通环境。这个聊天室系统充分利用了Linux操作系统的优势,为用户提供了一个安全、稳定的基础架构。以下是对该系统...

    linux QT 编程 聊天室 源码

    本聊天室源码是基于Linux环境利用QT库实现的一个网络通信项目,主要涉及的知识点包括: 1. **QT库介绍**:QT库提供了丰富的图形用户界面(GUI)组件,如按钮、文本框、列表视图等,同时也包含了网络编程、多线程、...

    基于Linux网络聊天室

    ### 基于Linux网络聊天室的关键知识点 #### 一、背景 ...通过以上内容,我们可以看到基于Linux的网络聊天室项目涉及了多个方面的知识和技术,不仅有助于提升编程能力,还能够促进对网络通信机制的理解。

    基于嵌入式LINUX的网络聊天室的设计

    本项目聚焦于在嵌入式系统上实现一个基于Linux的网络聊天室,这不仅展示了Linux的灵活性和可移植性,还体现了嵌入式系统的高效与便携特性。以下将详细介绍该设计的关键知识点。 一、嵌入式Linux系统 嵌入式Linux是...

    linux聊天室 tcp协议多并发模型

    Linux聊天室基于TCP协议实现多并发模型,这是一个典型的网络编程问题,涉及到客户端与服务器之间的连接建立、数据传输以及高并发处理。本文将深入探讨TCP协议、多并发模型以及如何在Linux环境中使用select函数来构建...

    Linux聊天室项目含说明文档【适合学习】

    【Linux聊天室项目含说明文档】是一个非常适合初学者和进阶者深入了解Linux系统编程和网络通信的实践项目。该项目旨在创建一个基本的在线聊天室,允许用户进行账号注册、登录,并进行实时聊天。通过这个项目,你可以...

    linux 聊天室程序 (udp协议)

    在本文中,我们将深入探讨如何在Linux环境下使用UDP(用户数据报协议)构建一个简单的聊天室程序。UDP是一种无连接的传输层协议,它不保证数据包的顺序、可靠性和完整性,但因其低延迟和高效性,常用于实时通信如...

    linux 网络聊天室

    总之,"Linux 网络聊天室"是一个结合了UDP网络编程、多进程处理和C/S架构的实践项目,对深入理解网络通信和系统编程有很好的学习价值。通过分析和实现这个项目,开发者可以提升自己的Linux技能和网络编程能力。

    基于Linux的聊天室设计.pdf

    在 Linux 系统下设计的聊天室系统设计,需要 4 个关键技术:C/S 架构、TCP 协议、多线程操作、Socket 套接字。 C/S 架构,即客户机与服务器架构,该架构有多个客户端和一个服务器,每一个客户端发出请求给服务器,...

Global site tag (gtag.js) - Google Analytics