envy2002 发表于 2013-1-31 02:44:43

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#defineDEBUG 5#defineWARNNING 4#defineERROR 3#defineWORKKING 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 levelif(pc_level==NULL){pc_level="WORKKING";}//printf("current level is%s\n",pc_level);//configure pathchar path;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="";}if(strcmp(pc_level,"WARNNING")==0){int_src=4;pc_preLog="";}if(strcmp(pc_level,"ERROR")==0){int_src=3;pc_preLog="";}if(strcmp(pc_level,"WORKKING")==0){int_src=1;pc_preLog="";}//create a file to write log.char target_path;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 timetime_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:falseint 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;}voiddelete_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={0};    mylog(" ","before receive.....",DEBUG);int recv_length=recv(client_socket_id,buffer,BUFFER_SIZE,0);mylog(" ","after receive.....",DEBUG);if (recv_length <= 0)    {          mylog(" ","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(" "," positively close connection socket",DEBUG);int i=0;for(;i<get_buffer_length(&list);i++){int socketid=list.p_buffer;close(socketid);}free(list.p_buffer);exit(0);}void *sendMsg(void *arg){while(1){char msg;//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 filemylog(" ","before create socket......",DEBUG);if((socketid=socket(AF_INET,SOCK_STREAM,0))<0)mylog(" ","create socket error",DEBUG);mylog(" ","after create socket......",DEBUG);//bindif(bind(socketid,(struct sockaddr*)&server_addr,size_of_addr)<0)mylog(" ","bind server address error",DEBUG);//listen    mylog(" ","before listen......",DEBUG);    if(listen(socketid,10)<0)mylog(" ","listen error",DEBUG);mylog(" ","after listen......",DEBUG);socklen_t client_length=sizeof(client_addr);mylog(" ","before accept......",DEBUG);while(1){int client_socket_id=accept(socketid,(struct sockaddr*)&client_addr,&client_length);mylog(" ","after accept......",DEBUG);if(client_socket_id<0)mylog(" "," client socket file id is negetive, worry",DEBUG);//set receive theadpthread_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 threadpthread_t send_thread_id;send_thread_id=pthread_create(&send_thread_id,NULL,sendMsg,NULL);    }while(1){char msg;//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 256int socketid=0;int client_result=0;void * receiveMsg(void * args){while(1){if(client_result<0){mylog(" ","no connection",DEBUG);exit(0);}char buffer={0};    mylog(" ","before receive.....",DEBUG);int recv_length=recv(socketid,buffer,BUFFER_SIZE,0);mylog(" ","after receive.....",DEBUG);if (recv_length <= 0)    {          mylog(" ","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;//printf("argv   %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 fileif((socketid=socket(AF_INET,SOCK_STREAM,0))<0)mylog(" ","create socket error",DEBUG);//bindif(bind(socketid,(struct sockaddr*)&client_addr,size_of_addr)<0){mylog(" ","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 theadpthread_t pthread_id;pthread_id=pthread_create(&pthread_id,NULL,receiveMsg,NULL);while(1){char msg={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(" ","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 256int socketid=0;int client_result=0;void * receiveMsg(void * args){while(1){if(client_result<0){mylog(" ","no connection",DEBUG);exit(0);}char buffer={0};    mylog(" ","before receive.....",DEBUG);int recv_length=recv(socketid,buffer,BUFFER_SIZE,0);mylog(" ","after receive.....",DEBUG);if (recv_length <= 0)    {          mylog(" ","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;//printf("argv   %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 fileif((socketid=socket(AF_INET,SOCK_STREAM,0))<0)mylog(" ","create socket error",DEBUG);//bindif(bind(socketid,(struct sockaddr*)&client_addr,size_of_addr)<0){mylog(" ","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 theadpthread_t pthread_id;pthread_id=pthread_create(&pthread_id,NULL,receiveMsg,NULL);while(1){char msg={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(" ","send worry",DEBUG);    }    close(socketid);return 0;}其中client.c和client2.c就是bind的端口不同而已,因为前期设计有问题,所以就用这个蠢办法来验证,这不是一个好的设计和实现。http://www.agoit.com/images/smiles/icon_smile.gif
页: [1]
查看完整版本: linux 聊天室 一对多