一个基于linux的聊天软件(并发服务器,sqlite3数据库,有注释)
来源:互联网 发布:个性简历 知乎 编辑:程序博客网 时间:2024/05/30 04:17
SC.h:
#include <stdio.h>#include <sys/socket.h>#include <stdlib.h>#include <fcntl.h>#include <arpa/inet.h>#include <netinet/in.h>#include <string.h>#include <errno.h>#include <sqlite3.h>#include <time.h>#include <sys/ipc.h>#include <sys/shm.h>#define ADMIN_SHOW 1#define ADMIN_BAN 2#define ADMIN_LIFT 3#define ADMIN_KICK 4#define ADMIN_EXIT 5typedef struct myinfo{ int flt; char name[20]; char sec[20];}MYINFO;typedef struct message{ int flt; char myname[20]; char name[20]; char message[200];}MES;typedef struct rev{ char myname[20]; char message[200]; int fd;}REV;typedef struct online{ int num; char name[8][20];}ONLINE;extern void s_chat(int,sqlite3 *,MES *,REV *);extern void s_view(int,sqlite3 *,MES *);extern void s_file(int,sqlite3 *,MES *,REV *);extern void s_getfile(int);
packet.c:
#include "../../include/SC.h"int Socket(int family,int type,int protocol){ int sockfd; if((sockfd = socket(family,type,protocol)) < 0) { perror("socket error!\n");exit(-1); } return sockfd;}int Bind(int sockfd,const struct sockaddr * myaddr,socklen_t addrlen){ int ret; if((ret = bind(sockfd,myaddr,addrlen)) < 0) { perror("bind error!\n");exit(-1); } return ret;}int Accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen){ int ret; return (ret = accept(sockfd,cliaddr,addrlen));}int Connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen){ int ret; if((ret = connect(sockfd,servaddr,addrlen)) == -1) { perror("connect error!\n");exit(-1); } return ret;}pid_t Fork(void){ pid_t pid; if((pid = fork()) < 0) { perror("fork error!\n");exit(-1); } return pid;}int Shmget(key_t key,int size,int shmflg){ int ret; if((ret = shmget(key,size,shmflg)) < 0) { perror("shmget error!\n");exit(-1); } return ret;}void *Shmat(int shmid,const void *shmaddr,int shmflg){ void *shmptr = NULL; if((shmptr = shmat(shmid,shmaddr,shmflg)) == (void *)(-1)) { perror("shmat error!\n");exit(-1); } return (void *)shmptr;}int Open(const char *pathname,int flags,mode_t mode){ int fd; if((fd = open(pathname,flags,mode)) == -1) { perror("open error!\n"); } return fd;}int Close(int fildes){ int ret; if((ret = close(fildes)) == -1) { perror("close error!\n");exit(-1); } return ret;}ssize_t Write(int fd,const void *buf,size_t count){ ssize_t ret; if((ret = write(fd,buf,count)) == -1) { perror("write error!\n");exit(-1); } return ret;}ssize_t Read(int fd,void *buf,size_t count){ ssize_t ret; if((ret = read(fd,buf,count)) == -1) { perror("read error!\n");exit(-1); } return ret;}void *Malloc(size_t size){ void *ret; if((ret = malloc(size)) == NULL) { perror("malloc error!\n");exit(-1); } return ret;}void Free(void *memblock){ free(memblock);}
server.c:
/********************************************************** ZYP Instant MessagerFilename:server.cAuthor:zypDescription:server main***********************************************************/#include "../../include/SC.h"/**********************************************************Function:int main()Return:intArgument:nullDescription:main***********************************************************/int main(){ int sockfd,bindret,i,result,nRow,nCoulum; sqlite3 *db; char *errmsg = NULL; char **dbresult; char **dbresults; char **dbresultr; REV *shmptr = NULL; //shmaddr int shmid; char buf[64]; //for transfer file struct sockaddr_in my_addr; int flt = 0; memset((&my_addr),0,sizeof(my_addr)); //set zero memset(buf,0,64); result = sqlite3_open("../myserever.db",&db); if(result != SQLITE_OK) { printf("open data base failure!\n");exit(-1); } sqlite3_exec(db,"drop table online",NULL,NULL,&errmsg); sqlite3_exec(db,"create table online(name text primary key unique,fd integer,flt integer)",NULL,NULL,&errmsg); //create table for online sockfd = Socket(AF_INET,SOCK_STREAM,0); fcntl(sockfd,F_SETFL,O_NONBLOCK); //set socket NONBLOCK if(sockfd < 0) { perror("sockfd error!\n");exit(-1); } my_addr.sin_family = AF_INET; my_addr.sin_port = htons(6666); my_addr.sin_addr.s_addr = INADDR_ANY; //auto bind Bind(sockfd,(struct sockaddr *)(&my_addr),sizeof(my_addr)); listen(sockfd,8); shmid = Shmget(IPC_PRIVATE,sizeof(REV),0666); shmptr = (REV *)Shmat(shmid,0,0); system("clear"); printf("\n\n\n\n\n\n\n\n\n\n\n"); printf("\t\t Welcomed the use of ZYP Instant Messenger\n"); printf("\n\n\n\n\n\n\n\n\n\n\n"); // welcome screen sleep(2); system("clear"); printf("Connecting to server now......\n"); sleep(1); system("clear"); printf("connect to server now!\n"); while(1) { int listenfd = -1; while(listenfd < 0) //wait accept and wait send message{ listenfd = Accept(sockfd,NULL,NULL); if(shmptr->fd != 0) { Write(shmptr->fd,shmptr,200);shmptr->fd = 0; }}if(listenfd < 0){ perror("accept error!\n"); exit(-1);}else{ pid_t pid = fork(); if(pid < 0) { perror("fork error!\n");exit(-1); } if(pid > 0) //father process { ; } if(pid == 0) //sub process { s_login(listenfd,db,shmptr);//login MES *come = (MES *)malloc(sizeof(MES)); while(1){ sqlite3_exec(db,"create table chat(time text,sendname text,message text,toname text)",NULL,NULL,&errmsg); //create table for chat if(Read(listenfd,come,sizeof(MES)) == 0) { char *str = sqlite3_mprintf("select name from online where fd='%d'",listenfd); sqlite3_get_table(db,str,&dbresult,&nRow,&nCoulum,&errmsg); //search nameprintf("%s Mandatory referrals\n",dbresult[1]);str = sqlite3_mprintf("delete from online where fd='%d'",listenfd);sqlite3_exec(db,str,0,0,&errmsg);sleep(1);break; } else if(strncmp(come->message,"file",4) == 0) //transfer file { s_file(listenfd,db,come,shmptr); } else if(strncmp(come->message,"getfile",7) == 0) //download file { s_getfile(listenfd); } else if(strncmp(come->message,"view",4) == 0) //view user online { s_view(listenfd,db,come); } else // chat { s_chat(listenfd,db,come,shmptr); }}Close(listenfd); }} } sqlite3_close(db); return 0;}
s_chat.c:
/********************************************************** ZYP Instant MessagerFilename:s_chat.cAuthor:zypDescription:for chat***********************************************************/#include "../../include/SC.h"/**********************************************************Function:void s_chat(int ,sqlite3 *,MES *,REV *)Return:nullAgrument:int listenfd,sqlite3 *,MES *,REV *Description:for chat***********************************************************/void s_chat(int listenfd,sqlite3 *db,MES *come,REV *shmptr){ int i,result,nRow,nRows,nCoulum,nCoulums; char *errmsg = NULL; char **dbresult; char **dbresults; char **dbresultr; if(come->flt == 1) //offline { char *sql = sqlite3_mprintf("select name from online where fd='%d'",listenfd);sqlite3_get_table(db,sql,&dbresults,&nRows,&nCoulums,&errmsg); //search fd printf("%s is offline\n",dbresults[1]);sql = sqlite3_mprintf("delete from online where fd='%d'",listenfd);sqlite3_exec(db,sql,0,0,&errmsg);sleep(1);exit(-1); } else //chat {if(strcmp(come->name,"all") == 0) //send to all user online{ char *str = sqlite3_mprintf("select flt from online where name='%s'",come->myname); sqlite3_get_table(db,str,&dbresultr,&nRow,&nCoulum,&errmsg); //is banned? int flt = atoi(dbresultr[1]); if(flt == 1) //not ban { char *str = sqlite3_mprintf("select fd from online");sqlite3_get_table(db,str,&dbresultr,&nRow,&nCoulum,&errmsg);int allfd;for(i = 1;i <= nRow;i++){ allfd = atoi(dbresultr[i]); if(allfd != listenfd) { REV *shmsend = (REV *)malloc(sizeof(REV)); shmsend->fd = allfd;strcpy(shmsend->myname,come->myname); strcpy(shmsend->message,come->message); memcpy(shmptr,shmsend,sizeof(REV)); int delay = 10000000;while(delay--);Free(shmsend);shmsend = NULL; }}time_t timer = time(NULL);char *tme = (char *)ctime(&timer); str = sqlite3_mprintf("insert into chat values('%s','%s','%s','%s')",tme,come->myname,come->message,come->name); sqlite3_exec(db,str,0,0,&errmsg);//save chat sqlite3_free_table(dbresultr);dbresultr = NULL; } else //banned {REV *jin = (REV *)malloc(sizeof(REV));memset(jin,0,sizeof(REV));strcpy(jin->myname,"Administrator");strcpy(jin->message,"Youbanned");Write(listenfd,jin,sizeof(REV));Free(jin);jin = NULL; }} else //to sb online{ char *str = sqlite3_mprintf("select flt from online where name='%s'",come->myname); sqlite3_get_table(db,str,&dbresultr,&nRow,&nCoulum,&errmsg); int flt = atoi(dbresultr[1]); if(flt == 1) {char *str = sqlite3_mprintf("select fd from online where name='%s'",come->name); sqlite3_get_table(db,str,&dbresultr,&nRow,&nCoulum,&errmsg); int sendfd = atoi(dbresultr[1]); REV *shmsend = (REV *)malloc(sizeof(REV)); shmsend->fd = sendfd; strcpy(shmsend->myname,come->myname);strcpy(shmsend->message,come->message);memcpy(shmptr,shmsend,sizeof(REV));time_t timer = time(NULL);char *tme = (char *)ctime(&timer); str = sqlite3_mprintf("insert into chat values('%s','%s','%s','%s')",tme,come->myname,come->message,come->name); sqlite3_exec(db,str,0,0,&errmsg); //save chat recordFree(shmsend);shmsend = NULL; } else //banned {REV *jin = (REV *)malloc(sizeof(REV));memset(jin,0,sizeof(REV));strcpy(jin->myname,"Administrator");strcpy(jin->message,"Youbanned");Write(listenfd,jin,sizeof(REV));Free(jin);jin = NULL; } } }}
s_login.c:
/********************************************************** ZYP Instant MessagerFilename:s_login.cAuthor:zypDescription:for login***********************************************************/#include "../../include/SC.h"/**********************************************************Function:void s_login(int ,sqlite3 * ,REV *)Return:nullArgument:int listenfd,sqlite3 *db,REV *shmptr***********************************************************/void s_login(int listenfd,sqlite3 *db,REV *shmptr){ int i,result,nRow,nRows,nCoulum,nCoulums; int flt = 0; char *errmsg = NULL; char **dbresult; char **dbresults; char **dbresultr; char *sql = NULL; MYINFO *myinfo = (MYINFO *)malloc(sizeof(MYINFO)); memset(myinfo,0,sizeof(MYINFO)); while(read(listenfd,myinfo,sizeof(MYINFO)) == 0); if(0) //login failure and login again {loop4:while(Read(listenfd,myinfo,sizeof(MYINFO)) == 0); goto loop5; } loop5: if(myinfo->flt == 1) //registratoin { sql = sqlite3_mprintf("select name from peopleinfo where name='%s'",myinfo->name);sqlite3_get_table(db,sql,&dbresult,&nRow,&nCoulum,&errmsg);if(nRow == 0) //ok{ char *str1 = sqlite3_mprintf("insert into peopleinfo values('%s','%s')",myinfo->name,myinfo->sec); char *str2 = sqlite3_mprintf("insert into online values('%s','%d','%d')",myinfo->name,listenfd,1); sqlite3_exec(db,str1,0,0,&errmsg); sqlite3_exec(db,str2,0,0,&errmsg); char *back = "yes"; flt = 1; Write(listenfd,back,sizeof(back));}else //repeat{ char *back = "haved"; Write(listenfd,back,sizeof(back));} } else //login { sql = sqlite3_mprintf("select * from peopleinfo where name='%s'",myinfo->name);sqlite3_get_table(db,sql,&dbresult,&nRow,&nCoulum,&errmsg);if(nRow != 0) //exist{ sql = sqlite3_mprintf("select * from online where name='%s'",myinfo->name); sqlite3_get_table(db,sql,&dbresults,&nRows,&nCoulums,&errmsg); if(nRows != 0)//online,can not repeat login { char *back = "login";Write(listenfd,back,sizeof(back)); } else // offline { if(strcmp(myinfo->sec,dbresult[3]) == 0) //password right{ sql = sqlite3_mprintf("insert into online values('%s','%d','%d')",myinfo->name,listenfd,1); sqlite3_exec(db,sql,0,0,&errmsg); if(strcmp(myinfo->name,"admin") == 0) //administrator { char *back = "ad"; Write(listenfd,back,sizeof(back)); goto loop7; //goto adminstrator scree } char *back = "yes"; flt = 1; Write(listenfd,back,sizeof(back));}else // password error{ char *back = "secerror"; Write(listenfd,back,sizeof(back));} }} else //not exist{ char *back = "nothave"; Write(listenfd,back,sizeof(back)); } } if(flt != 1) //login failure {goto loop4; } printf("%s on the line\n",myinfo->name); if(0) //administrator { loop7:printf("Administrator on the line\n");char *back = (char *)malloc(10);memset(back,0,10);while(Read(listenfd,back,sizeof(back)) == 0);if(strncmp(back,"1",1) == 0){ goto loop12; //login as an ordinary user}else{ while(1) { while(Read(listenfd,back,sizeof(back)) == 0); if(strncmp(back,"a",1) == 0) //view { sql = sqlite3_mprintf("select name from online"); sqlite3_get_table(db,sql,&dbresults,&nRows,&nCoulums,&errmsg); int *backnum = ((int*)nRow); ONLINE allname; allname.num = (int)nRows; for(i = 1;i <= nRows;i++) { strcpy(allname.name[i-1],dbresults[i]); } Write(listenfd,&allname,sizeof(allname)); } else if(strncmp(back,"b",1) == 0)//ban { memset(back,0,10); read(listenfd,back,10); sql = sqlite3_mprintf("update online set flt=0 where name='%s'",back); sqlite3_exec(db,sql,NULL,NULL,&errmsg); } else if(strncmp(back,"c",1) == 0)//lift ban { memset(back,0,10); read(listenfd,back,10); sql = sqlite3_mprintf("update online set flt=1 where name='%s'",back); sqlite3_exec(db,sql,NULL,NULL,&errmsg); } else if(strncmp(back,"d",1) == 0)//kick out { memset(back,0,10); Read(listenfd,back,10); sql = sqlite3_mprintf("select fd from online where name='%s'",back); sqlite3_get_table(db,sql,&dbresult,&nRow,&nCoulum,&errmsg); REV *ti = (REV *)malloc(sizeof(REV)); strcpy(ti->myname,"Administrator"); strcpy(ti->message,"exit"); ti->fd = atoi(dbresult[1]); memcpy(shmptr,ti,sizeof(REV)); } else //exit { printf("Administrator is offline\n"); close(listenfd); exit(0); } } } } loop12: printf("");}
/********************************************************** ZYP Instant MessagerFilename:s_file.cAuthor:zypDescription:for transfer file***********************************************************/#include "../../include/SC.h"/**********************************************************Function:void s_file(int ,sqlite3 *,MES * ,REV *)Return:nullArgument:int listenfd,sqlite3 *db,MES *come,REV *shmptrDescription:for transfer file***********************************************************/void s_file(int listenfd,sqlite3 *db,MES *come,REV *shmptr){ int ret; int result,nRows,nCoulums; char ** dbresults; char *errmsg = NULL; REV *file = (REV *)malloc(sizeof(REV)); char *filename = (char *)malloc(60); char buffer[128]; memset(filename,0,60); file->fd = listenfd; strcpy(file->myname,come->myname); strcpy(file->message,"file"); Write(listenfd,file,sizeof(REV)); //send message to client while((Read(listenfd,filename,60) == 0) || (strcmp(filename,"") == 0)); if(strncmp(filename,"failure",7) == 0) {printf("transfer failure");; } else {int fp = Open("./scopy.c",O_RDWR | O_CREAT | O_APPEND,0777);if(fp == -1){ printf("open file failure!\n");}else{ do //transfer file { memset(buffer,0,128);ret = Read(listenfd,buffer,128);Write(fp,buffer,ret); }while(ret == 128);}Close(fp);char *str = sqlite3_mprintf("select fd from online where name='%s'",come->name);sqlite3_get_table(db,str,&dbresults,&nRows,&nCoulums,&errmsg);int tofd = ((dbresults[1][0]) - '0');file->fd = tofd; //send message to target client to downloadstrcpy(file->myname,"getfile");strcpy(file->message,filename);memcpy(shmptr,file,sizeof(REV)); }}
s_getfile.c:
/********************************************************** ZYP Instant MessagerFilename:s_getfile.cAuthor:zypDescription:for target client to download file***********************************************************/#include "../../include/SC.h"/*********************************************************Function:s_getfile(int)Return:nullArgument:int listenfdDescription:for target client to download file**********************************************************/void s_getfile(int listenfd){ int ret; int fp = Open("scopy.c",O_RDONLY,0777); if(fp == -1) { printf("open file failure!\n"); } else { char buffer[128]; //for transfer filedo //transfer file{ memset(buffer,0,128); ret = Read(fp,buffer,128); Write(listenfd,buffer,ret);}while(ret == 128); } system("rm -rf scopy.c"); //remove file}
client.c:
/********************************************************** ZYP INstant MessagerFilename:client.cAuthor:zypDescription:socket connect***********************************************************/#include "../../include/SC.h"/**********************************************************Function:main()Description:main function***********************************************************/int main(int argc,char *argv[]){ if(argc != 2) { printf("format: ./client serverIP\n");exit(-1); } int sockfd; char *name = (char *)Malloc(20); struct sockaddr_in my_addr; memset((&my_addr),0,sizeof(my_addr)); //set zero sockfd = Socket(AF_INET,SOCK_STREAM,0); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(6666); //Port my_addr.sin_addr.s_addr = inet_addr(argv[1]); //server IP Connect(sockfd,(struct sockaddr *)(&my_addr),sizeof(my_addr)); name = (char *)c_login(sockfd); //save local user name pid_t pid = Fork(); if(pid == 0) //Sub process receives the message { c_revmesg(sockfd); } if(pid > 0) //send process send the message { sendmesg(sockfd,name,pid); } Close(sockfd); Free(name); name = NULL; return 0;}
c_login.c:
/********************************************************** ZYP Instant MessagerFilename:c_login.cAuthor:zypDescription:For the registration and landing***********************************************************/#include "../../include/SC.h"/**********************************************************Function:char *c_login(int)Return:local user nameArgument:int sockfdDescription:For the registration and landing***********************************************************/char * c_login(int sockfd){ MES *message = (MES *)Malloc(sizeof(MES)); //Data packet MYINFO *myinfo = (MYINFO *)Malloc(sizeof(MYINFO)); //Personal information data packet int i; char *nameptr = message->name; char *back = (char *)Malloc(10); char *give = (char *)Malloc(sizeof(char)); char yn; system("clear"); //clear screen printf("\n\n\n\n\n\n\n\n\n\n\n"); printf("\t\t Welcomed the use of ZYP Instant Messenger\n"); printf("\n\n\n\n\n\n\n\n\n\n\n"); sleep(2); system("clear"); printf("\n\n\n\n\n\n\n\n\n\n"); printf("\t\t\t Register now ?\n"); loop1: printf("\t Register(Y)/I have already registered,Login now(N)\n"); printf("\n\n\n\n\n\n\n\n\n\n\n"); setbuf(stdin,0); scanf("%c",&yn); if(yn == 'Y') //register { loop2:system("clear");printf("/***************** Register ***************/\n");printf("Please input the name:");scanf("%s",myinfo->name);printf("Please enter your password: ");scanf("%s",myinfo->sec);myinfo->flt = 1;Write(sockfd,myinfo,sizeof(MYINFO)); //send personal information to serverRead(sockfd,back,sizeof(back)); //return informationif(strcmp(back,"have") == 0) //already exists{ printf("\nThe name you register is existing!\n"); printf("Please fill in again!\n"); sleep(1); goto loop2;}printf("\nRegistraation success!\n");printf("Welcome to the frist logining!\n");sleep(1);system("clear"); } else if(yn == 'N') //login { loop3:system("clear");printf("/***************** Login ***************/\n");printf("Please input the name:");scanf("%s",myinfo->name);printf("Please enter your password:");scanf("%s",myinfo->sec);myinfo->flt = 0;Write(sockfd,myinfo,sizeof(MYINFO));Read(sockfd,back,sizeof(back));if(strcmp(back,"noth") == 0) //do not exist{ printf("\nUser does not exist!\n"); printf("Please fill in again!\n"); sleep(1); goto loop3;} else if(strcmp(back,"sece") == 0)//password error{ printf("\nPassword is not correct!\n"); printf("Please fill in again!\n"); sleep(1); goto loop3;} else if(strcmp(back,"logi") == 0)//repeat login{ printf("\nUser is logged in!\n"); printf("Please fill in again!\n"); sleep(1); goto loop3;} else if(strcmp(back,"ad") == 0)//user is administrator{ printf("\nHello! Administrator!\n"); sleep(1); goto loop8;}printf("\nLogin Successful!\n");sleep(1);system("clear"); } else {printf("\nInvalid input!Please input again!\n");goto loop1; } if(0) //for administrator { loop8: system("clear");printf("/************** Administrator ************/\n"); printf("/******** 1.Ordinary User Login **********/\n");printf("/******** 2.Administrator Login **********/\n"); loop9:printf("Please select:"); setbuf(stdin,0);int choose; scanf("%d",&choose);if((choose < 1) || (choose > 2)) { printf("Invalid input!Please input again!\n"); goto loop9;} if(choose == 1) //login as an ordinary user{ memset(give,0,sizeof(give)); strcpy(give,"1"); Write(sockfd,give,sizeof(char)); goto loop10; }else //login as administrator { memset(give,0,sizeof(give)); strcpy(give,"2"); Write(sockfd,give,sizeof(char)); while(1) { system("clear"); printf("/************** Administrator ************/\n"); printf("/********** 1.Show User Is Online ********/\n"); printf("/********** 2.Banned Words ********/\n"); printf("/********** 3.Lift The Ban ********/\n"); printf("/********** 4.Kick Sb Out ********/\n"); printf("/********** 5.Exit ********/\n"); loop11: printf("Please select:"); scanf("%d",&choose); if((choose < 1) || (choose > 5)){ printf("Invalid input!Please input again!\n"); goto loop11; }if(choose == ADMIN_SHOW) // show user online{ memset(give,0,sizeof(give)); strcpy(give,"a"); Write(sockfd,give,sizeof(give)); ONLINE allname; Read(sockfd,&allname,sizeof(allname)); printf("List of user is online:\n"); printf("--------------\n"); for(i = 0;i < (allname.num);i++) { printf("%d:%s\n",i+1,allname.name[i]); } printf("--------------\n"); sleep(2);}else if(choose == ADMIN_BAN) //ban words{ memset(give,0,sizeof(give)); strcpy(give,"b"); Write(sockfd,give,sizeof(give)); printf("Please input the name of silenced people:"); char * adname = (char *)malloc(10); scanf("%s",adname); Write(sockfd,adname,10); printf("%s is forbiddon to speck!\n",adname); sleep(1);}else if(choose == ADMIN_LIFT) //lift the ban{ memset(give,0,sizeof(give)); strcpy(give,"c"); Write(sockfd,give,sizeof(char)); printf("Please input the name you want to lift ban:"); char * adname = (char *)malloc(10); scanf("%s",adname); Write(sockfd,adname,10); printf("%s have lift ban\n",adname); sleep(1);}else if(choose == ADMIN_KICK) //kick sb out{ memset(give,0,sizeof(give)); strcpy(give,"d"); Write(sockfd,give,sizeof(char)); printf("Please input the name you want to kick out:"); char * adname = (char *)malloc(10); scanf("%s",adname); Write(sockfd,adname,10); printf("%s have been kick out!\n",adname); sleep(1);}else //exit{ memset(give,0,sizeof(give)); strcpy(give,"e"); Write(sockfd,give,sizeof(char)); printf("ByeBye Administrator!\n"); Close(sockfd); exit(0);} }} } loop10: printf(""); Free(message); message = NULL; Free(back); back = NULL; Free(give); give = NULL; return (char *)(myinfo->name); }
c_revmessage.c:
/********************************************************** ZYP Instant MessagerFilename:c_revmessage.cAuthor:zypDescription:for revice message***********************************************************/#include "../../include/SC.h"/**********************************************************Function:void c_revmesg(int sockfd)Return:nullArgument:int sockfdDescription:for rveice message***********************************************************/void c_revmesg(int sockfd){ REV *revinfo = (REV *)malloc(sizeof(REV)); int fp,ret,i; char buffer[128]; //for send file while(1) { if((Read(sockfd,revinfo,sizeof(REV))) == 0) //server exit{ printf("The server have to exit!\n"); exit(-1); } else{ if((strncmp(revinfo->message,"exit",4) == 0))//kick out { printf("You have been kicked out!\n");kill(getppid(),9);exit(-1); } else if(strncmp(revinfo->myname,"view",4) == 0)//show user is online { ONLINE allname;memset(&allname,0,sizeof(ONLINE));Read(sockfd,&allname,sizeof(ONLINE)); //revice allnameprintf("List of user is online:\n");printf("------------------\n");for(i = 0;i < allname.num;i++){ printf("%d:%s\n",i+1,allname.name[i]);}printf("------------------\n"); } else if(strncmp(revinfo->myname,"getfile",7) == 0)//download file {fp = open("./copy.c"/*revinfo->message*/,O_WRONLY | O_CREAT | O_APPEND,0777);if(fp == -1){ printf("open failure!\n");}else{ MES *getfile = (MES *)malloc(sizeof(MES)); getfile->flt = 0; strcpy(getfile->myname,"zzzz"); strcpy(getfile->message,"getfile"); strcpy(getfile->name,"zzzz"); Write(sockfd,getfile,sizeof(MES)); do //download { memset(buffer,0,128); ret = read(sockfd,buffer,128);Write(fp,buffer,ret); }while(ret == 128); printf("revice a file!\n");}close(fp); } else if(strncmp(revinfo->message,"file",4) == 0) {char *filename = (char *)malloc(60); strcpy(filename,revinfo->myname); printf("Transferring file %s\n",filename); if((fp = Open(filename,O_RDONLY,0777)) == -1){ //printf("open file failure!\n"); strcpy(filename,"failure"); Write(sockfd,filename,60); //send filename} else { Write(sockfd,filename,60); sleep(1); do { memset(buffer,0,128); ret = Read(fp,buffer,128);Write(sockfd,buffer,ret); }while(ret == 128); printf("Transfer file %s success!\n",filename); }close(fp); } else { if((strcmp(revinfo->myname,"") == 0) || (strcmp(revinfo->message,"") == 0)){ ; }else { time_t timer = time(NULL); //time show struct tm *local = localtime(&timer); printf("\n%s %02d:%02d:%02d\n",revinfo->myname,local->tm_hour,local->tm_min,local->tm_sec); puts(revinfo->message);} }} }}
c_sendmessgae.c:
/********************************************************** ZYP Instant MessagerFilename:c_sendmessage.cAuthor:zypDescription:for send message***********************************************************/#include "../../include/SC.h"/**********************************************************Function:void sendmesg(int,char *,int)Return:nullArgument:int sockfd,char *name,int pid***********************************************************/void sendmesg(int sockfd,char *name,int pid){ MES *message = (MES *)malloc(sizeof(MES));//Data packet char *nameptr = message->name; while(1) { strcpy(message->myname,name); if(message->name == nameptr) //conncet to sb{ loop6: printf("Please enter the contact:"); setbuf(stdin,0); scanf("%s",message->name); setbuf(stdin,0); nameptr = NULL;}setbuf(stdin,0);fgets(message->message,200,stdin);setbuf(stdin,0);message->flt = 0;if(!strncmp(message->message,"quit",4)) //offline { message->flt = 1; Write(sockfd,message,200); close(sockfd); kill(pid,9); exit(-1); }if(!(strncmp(message->message,"change",6)))//change chat { goto loop6;}if(!(strncmp(message->message,"file",4))) //transfer file{ system("clear"); system("ls"); printf("Please input filename to transfer:"); scanf("%s",message->myname);}if(!(strncmp(message->message,"/hello",6))){ strcpy(message->message,"^_^");}Write(sockfd,message,200); }}
- 一个基于linux的聊天软件(并发服务器,sqlite3数据库,有注释)
- 嵌入式 一个基于linux的聊天软件(并发服务器,sqlite3数据库,有注释)
- Linux Linux函数 Linux聊天程序 基于socket的TCP(有连接的)聊天程序
- Linux Linux函数 Linux聊天程序 基于socket的TCP(有连接的)聊天程序
- 基于Linux和Qt的聊天软件
- linux下基于socket的聊天软件
- 基于linux下控制台,多线程并发控制的聊天程序(服务器端)
- 基于vs2008的一个简单的多线程聊天程序(有界面)
- 第一篇博客-自己的小聊天软件-linux下socket基于TCP协议聊天软件
- 基于控制台和数据库的聊天软件开发文档(一)
- Linux数据库(sqlite3)
- 基于 Linux sqlite3 的通讯录
- 一个在Linux下可以使用的聊天软件.
- 一个简单的基于select的并发服务器
- Linux TCP 服务器编程(六):基于线程的并发服务器
- linux/Windows 基于TCP协议的文件传输源码(有注释)
- 基于信鸽的在线聊天软件(一)
- C++ 基于CSocket的网络聊天软件(1)
- 内核线程
- ubuntu下samba的安装配置
- box2d学习总结
- 用 top 命令查看 CPU 使用率
- 由于录入原因库存项有而实际仓库类型及数量不一致
- 一个基于linux的聊天软件(并发服务器,sqlite3数据库,有注释)
- androd fsck分析
- poj 3625 Building Roads (最小生成树)
- source insight 常用快捷键(右键里大多功能有快捷键提示)
- 读取EXCEL档为DataTable,后作处理导入数据库
- 动态链接库
- keilc51中如何看堆栈的分配情况
- Android本地服务的启动 - zygote服务及Dalvik环境启动
- JavaScript push()方法