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的端口不同而已,因为前期设计有问题,所以就用这个蠢办法来验证,这不是一个好的设计和实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值