ネットワークプログラミング項目(チャットルーム項目)


一、目標を実現する
Linuxで使用できるチャットソフトは、少なくとも以下の機能を実現する必要があります。1.Client/Serverアーキテクチャを採用しています。Client Aはチャットサーバに登録する前に、自分のIDとパスワードを登録してください。登録が成功したら、Client Aは自分のIDとパスワードでチャットサービス4.複数のClient Xを同時にチャットサーバに登録してから、他のユーザーと通信チャットをする5.Client Aがログインしたら、現在チャットルームの他の子を確認できます。先ユーザClient x 6.Client Aは特定のClient xにメッセージを送ることができます。すなわち、「こっそり話」機能7.Client Aはメッセージをすべてのオンラインユーザーに送ることができます。つまり、「グループメッセージ」機能8.Client Aは終了時にチャット記録を保存する必要がある9.Server端はユーザー登録のチャット会の記録ファイルを維持して、確認するために
実現可能な追加機能を選択できます。1.Serverは、チャットルームを管理するための特別な権限のアカウントadminを構築できます。2.Adminは、あるClient Xを「チャットルームを蹴る」ことができます。3.Adminは、あるClient Xを「傍聴しかできない、発言できない」として設定できます。入力すると、自動的に「XXXはみんなに笑顔を作った」と送ります。5.Cientセグメントにはいくつかの常用語が追加されます。その中のいくつかの部分に「名前の置き換え」ができます。例えば、入力/CientA/welcomeは自動的に「CientA大侠」を送ります。私達のチャットルームにいらっしゃいます。Cient.cソースファイルです。
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  
#include 
#include 
#include 

#define PORT  9999

char myName[20];        //      
char msg1[1024];        //       

sqlite3 * database;

int flag1 = 0;          //          (   )
int flag2 = 0;          //         (   )
int flag3 = 0;          //            (   )
int flag4 = 0;          //          (    )

//   
struct Msg
{
    char msg[1024];         //     
    int  cmd;               //     
    char filename[50];      //      
    char toname[20];        //      
    char fromname[20];      //      
    int  sig;               //     (0:   、1:    、2:   )
};

struct Msg msg;     //           

//   /    
void interface1()
{
    system("clear");
    printf ("\t***************************       *****************************
"
); printf ("\t* *
"
); printf ("\t* *
"
); printf ("\t* 1、 *
"
); printf ("\t* 2、 *
"
); printf ("\t* q、 *
"
); printf ("\t* *
"
); printf ("\t* *
"
); printf ("\t* BY szw *
"
); printf ("\t********************************************************************

"
); printf ("\t***** : "); } // void interface2() { system("clear"); printf ("\t*************************** *****************************
"
); printf ("\t* *
"
); printf ("\t* *
"
); printf ("\t* 1、 *
"
); printf ("\t* 2、 *
"
); printf ("\t* 3、 *
"
); printf ("\t* 4、 *
"
); printf ("\t* 5、 *
"
); printf ("\t* 6、 *
"
); printf ("\t* 7、 *
"
); printf ("\t* Q、 *
"
); printf ("\t* *
"
); printf ("\t* *
"
); printf ("\t* BY szw *
"
); printf ("\t********************************************************************

"
); printf ("\t***** : "); } // void interface3() { system("clear"); printf ("\t*************************** *****************************
"
); printf ("\t* *
"
); printf ("\t* *
"
); printf ("\t* 1、 *
"
); printf ("\t* 2、 *
"
); printf ("\t* 3、 *
"
); printf ("\t* 4、 *
"
); printf ("\t* 5、 *
"
); printf ("\t* 6、 *
"
); printf ("\t* 7、 *
"
); printf ("\t* 8、 *
"
); printf ("\t* Q、 *
"
); printf ("\t* *
"
); printf ("\t* *
"
); printf ("\t* BY szw *
"
); printf ("\t********************************************************************

"
); printf ("\t***** : "); } // void keep_msg(char * msg1) { // int ret = sqlite3_open("Histroy.db", &database); if (ret != SQLITE_OK) { printf ("\t
"
); return; } // histroy char buf[100]; char *errmsg = NULL; sprintf (buf, "insert into histroy values('%s','%s','%s')",msg.fromname,msg.toname,msg1); ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf ("\t :%s
"
, errmsg); return; } } // void receive() { printf ("
\t .....
"
); int fd2 = open(msg.filename, O_WRONLY|O_CREAT, 0777); if (fd2 == -1) { perror ("open fd2"); return; } write (fd2, msg.msg, 1023); close (fd2); } // void *readMsg(void *v) { int socketfd = (int)v; while(1) { if (flag1 == 1) // { flag1 = 0; // pthread_exit(NULL); } read (socketfd, &msg, sizeof(msg)); switch(msg.cmd) { case 9001: // sprintf (msg1, " %s :
\t%s"
, msg.fromname,msg.msg); printf ("

\t%s
"
, msg1); printf ("
\t
"
); keep_msg (msg1); break; case 9002: // printf ("
\t%s :
\t%s
"
, msg.fromname, msg.msg); sprintf (msg1,"%s %s :
\t%s"
,msg.fromname, msg.toname, msg.msg); printf ("
\t
"
); keep_msg (msg1); break; case 9003: // sleep(3); printf ("
\t ,
"
); printf ("
\t
"
); break; case 9004: // printf ("

\t , :"
); fflush(stdout); flag3 = 1; break; case 9005: // printf ("
\t
"
); printf ("
\t
"
); break; case 9006: // printf ("
\t ,
"
); printf ("
\t
"
); break; case 9007: // if (flag2 != 1) printf ("
\t %s
"
, msg.fromname); else receive(); break; case 9008: // printf ("
\t%s ,
"
, msg.fromname); printf ("
\t
"
); flag2 = 0; // break; case 9009: // printf ("
\t !
"
); sleep(1); break; case 9010: // printf ("
\t ,
"
); usleep(1500000); break; case 9011: // printf ("
\t ,
"
); printf ("
\t
"
); flag4 = 1; break; case 9012: // printf ("
\t
"
); printf ("
\t
"
); flag4 = 0; break; case 9013: // printf ("
\t , ....
"
); //sleep (2); flag1 = 1; break; } usleep(400000); } } // void display (int socketfd) { msg.cmd = 1; write (socketfd, &msg, sizeof(struct Msg)); // usleep(100000); printf ("
\t :%d
"
, msg.cmd); printf ("
\t
"
); getchar(); } // , void quit_chatroom (int socketfd) { msg.cmd = 10; strcpy (msg.fromname, myName); write (socketfd, &msg, sizeof(struct Msg)); // } // void chat1(int socketfd) { if (flag4 == 1) { printf ("
\t , ...
"
); return; } msg.cmd = 2; strcpy (msg.fromname, myName); strcpy(msg.toname, "all"); printf ("
\t :
\t"
); scanf ("%s",msg.msg); getchar(); write (socketfd, &msg, sizeof(struct Msg)); // printf ("
\t , .....
"
); // usleep (500000); } // void chat2(int socketfd) { msg.cmd = 3; strcpy (msg.fromname, myName); printf ("
\t :
\t"
); scanf ("%s",msg.toname); getchar(); printf ("\t :
\t"
); scanf ("%s",msg.msg); getchar(); write (socketfd, &msg, sizeof(struct Msg)); // printf ("
\t , .....
"
); usleep (500000); } // void chat1_hst() { system("clear"); printf ("\t*************************** *****************************


"
); printf ("\t :
"
); // int ret = sqlite3_open("Histroy.db", &database); if (ret != SQLITE_OK) { printf ("\t
"
); return; } // histroy char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from histroy"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } int i; for (i = 1+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], "all") == 0) { printf ("
\t%s
"
, resultp[i+1]); } } sqlite3_free_table(resultp); // sqlite3_close(database); } // void chat2_hst() { system("clear"); printf ("\t*************************** *****************************


"
); printf ("\t :
"
); // int ret = sqlite3_open("Histroy.db", &database); if (ret != SQLITE_OK) { printf ("\t
"
); return; } // histroy char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from histroy"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } int i; for (i = 1+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], "all") != 0) { printf ("
\t%s
"
, resultp[i+1]); } } sqlite3_free_table(resultp); // sqlite3_close(database); } // void dis_histroy(int socketfd) { printf ("
\t a、
\t b、
\t"
); printf ("
\t***** : "
); switch (getchar()) { case 'a': chat1_hst(); break; case 'b': chat2_hst(); break; } printf ("
\t "
); getchar(); } // void convey_confirm(int socketfd) { msg.cmd = 5; strcpy (msg.fromname, myName); printf ("
\t :
\t"
); scanf ("%s",msg.toname); getchar(); printf ("
\t , .....
"
); write (socketfd, &msg, sizeof(struct Msg)); // } // void convey_chose(int socketfd) { msg.cmd = 9007; strcpy (msg.toname, msg.fromname); strcpy (msg.fromname, myName); printf ("
\t :

\t"
); fflush(stdout); system ("ls"); printf ("
\t : "
); printf ("
\t"
); scanf ("%s",msg.filename); getchar(); // int fd1 = open(msg.filename, O_RDONLY); if (fd1 == -1) { perror ("open fd1"); return; } int ret = 0; flag1 = 1; // while (ret = read (fd1, msg.msg, 1023)) { if (ret == -1) { perror("read"); break; } printf ("
\t , ......
"
); write (socketfd, &msg, sizeof(struct Msg)); sleep(1); } msg.cmd = 9008; write (socketfd, &msg, sizeof(struct Msg)); printf ("
\t
"
); close (fd1); // pthread_t id; pthread_create(&id, NULL, readMsg, (void*)socketfd); pthread_detach(id); // getchar(); } // void convey(int socketfd) { system("clear"); printf ("\t*************************** *****************************


"
); printf ("\t 1、
"
); printf ("\t 2、
"
); printf ("
\t***** : "
); char ch[2]; fgets(ch, 2, stdin); while (getchar()!= '
'
); switch (ch[0]) { case '1': // convey_confirm(socketfd); break; case '2': // convey_chose(socketfd); break; } printf ("
\t "
); getchar(); } // void change_pass(int socketfd) { char ch[2]; msg.cmd = 6; printf ("
\t ?(y/n): "
); fgets(ch, 2, stdin); while (getchar()!= '
'
); if (ch[0] != 'y') { printf ("
\t .....
"
); usleep(700000); return; } printf ("\t : "); scanf ("%s", msg.msg); getchar(); printf ("\t : "); scanf ("%s", msg.filename); getchar(); strcpy (msg.fromname, myName); write (socketfd, &msg, sizeof(struct Msg)); // printf ("
\t , ......
"
); sleep(1); } // void delete_user(int socketfd) { msg.cmd = 8; printf ("
\t ......
"
); write (socketfd, &msg, sizeof(struct Msg)); // sleep(1); printf ("\t !
"
); } // void user_do (int socketfd) { char ch[2]; while(1) { interface2(); if (flag3 == 1) { printf ("

\t%s , ?(y/n):"
, msg.fromname); fflush(stdout); fgets(ch, 2, stdin); while (getchar()!= '
'
); if (ch[0] != 'y') { printf ("
\t
"
); printf ("
\t
"
); } else { printf ("
\t
"
); printf ("
\t
"
); flag2 = 1; } if (flag2 == 0) { msg.cmd = 9005; // strcpy (msg.toname,msg.fromname); // strcpy (msg.fromname, myName); write (socketfd, &msg, sizeof(struct Msg)); } else if (flag2 == 1) { msg.cmd = 9006; // strcpy (msg.toname,msg.fromname); // strcpy (msg.fromname, myName); write (socketfd, &msg, sizeof(struct Msg)); } flag3 = 0; // flag2 = 0; } fgets(ch, 2, stdin); while (getchar()!= '
'
); switch(ch[0]) { case '1': // display(socketfd); break; case '2': // chat1(socketfd); printf ("
\t
"
); getchar(); break; case '3': // chat2(socketfd); printf ("
\t
"
); getchar(); break; case '4': // dis_histroy(socketfd); getchar(); break; case '5': // convey(socketfd); break; case '6': // change_pass(socketfd); break; case '7': // printf ("
\t ?(y/n): "
); fgets(ch, 2, stdin); while (getchar()!= '
'
); if (ch[0] != 'y') { printf ("
\t .....
"
); usleep(700000); break; } delete_user(socketfd); case 'q': // flag1 = 1; quit_chatroom(socketfd); printf ("
\t , ......
"
); break; } if (flag1 == 1) // { break; } system("clear"); } } // void silent (int socketfd) { msg.cmd = 9011; strcpy (msg.fromname, myName); printf ("
\t :
\t"
); scanf ("%s",msg.toname); getchar(); write (socketfd, &msg, sizeof(struct Msg)); // printf ("
\t , .....
"
); usleep (500000); } // void silent_del (int socketfd) { msg.cmd = 9012; strcpy (msg.fromname, myName); printf ("
\t :
\t"
); scanf ("%s",msg.toname); getchar(); write (socketfd, &msg, sizeof(struct Msg)); // printf ("
\t , .....
"
); usleep (500000); } // void kickout (int socketfd) { msg.cmd = 9013; strcpy (msg.fromname, myName); printf ("
\t :
\t"
); scanf ("%s",msg.toname); getchar(); write (socketfd, &msg, sizeof(struct Msg)); // printf ("
\t , .....
"
); usleep (500000); } // void supuser (int socketfd) { system("clear"); printf ("\t*************************** *****************************


"
); printf ("\t 1、
"
); printf ("\t 2、
"
); printf ("\t 3、
"
); printf ("
\t***** : "
); char ch[2]; fgets(ch, 2, stdin); while (getchar()!= '
'
); switch (ch[0]) { case '1': // silent(socketfd); break; case '2': // silent_del(socketfd); break; case '3': // kickout(socketfd); break; } printf ("
\t "
); getchar(); } // void supuser_do (int socketfd) { char ch[2]; while(1) { interface3(); if (flag3 == 1) { printf ("

\t%s , ?(y/n):"
, msg.fromname); fflush(stdout); fgets(ch, 2, stdin); while (getchar()!= '
'
); if (ch[0] != 'y') { printf ("
\t
"
); printf ("
\t
"
); } else { printf ("
\t
"
); printf ("
\t
"
); flag2 = 1; } if (flag2 == 0) { msg.cmd = 9005; // strcpy (msg.toname,msg.fromname); // strcpy (msg.fromname, myName); write (socketfd, &msg, sizeof(struct Msg)); } else if (flag2 == 1) { msg.cmd = 9006; // strcpy (msg.toname,msg.fromname); // strcpy (msg.fromname, myName); write (socketfd, &msg, sizeof(struct Msg)); } flag3 = 0; // flag2 = 0; } fgets(ch, 2, stdin); while (getchar()!= '
'
); switch(ch[0]) { case '1': // display(socketfd); break; case '2': // chat1(socketfd); printf ("
\t
"
); getchar(); break; case '3': // chat2(socketfd); printf ("
\t
"
); getchar(); break; case '4': // dis_histroy(socketfd); getchar(); break; case '5': // convey(socketfd); break; case '6': // change_pass(socketfd); break; case '8': // supuser (socketfd); break; case '7': // printf ("
\t ?(y/n): "
); fgets(ch, 2, stdin); while (getchar()!= '
'
); if (ch[0] != 'y') { printf ("
\t .....
"
); usleep(700000); break; } delete_user(socketfd); case 'q': // flag1 = 1; quit_chatroom(socketfd); printf ("
\t , ......
"
); break; } if (flag1 == 1) // { break; } system("clear"); } } // void log_in(int socketfd) { char password[20]; msg.cmd = 2; printf ("
\t :
"
); printf ("\t : "); scanf ("%s", myName); getchar(); printf ("\t : "); scanf ("%s", password); getchar(); strcpy (msg.fromname, myName); strcpy (msg.msg, password); write (socketfd, &msg, sizeof(struct Msg)); // read (socketfd, &msg, sizeof(struct Msg)); // printf ("
\t ......
"
); sleep(1); if (msg.cmd == 1002) { printf ("
\t , ......
"
); usleep(1500000); flag4 = msg.sig; // // , pthread_t id; pthread_create(&id, NULL, readMsg, (void*)socketfd); pthread_detach(id); user_do (socketfd); } else if (msg.cmd == 1003) { printf ("
\t , ......
"
); usleep(1500000); // , pthread_t id; pthread_create(&id, NULL, readMsg, (void*)socketfd); pthread_detach(id); supuser_do (socketfd); } else if (msg.cmd == -4) { printf ("
\t
"
); } else if (msg.cmd == -3) { printf ("
\t ,
"
); } else if (msg.cmd == -2) { printf ("\t ,
"
); } else if (msg.cmd == -1) { printf ("\t
"
); } usleep(1500000); } // ( ) void reg(int socketfd) { msg.cmd = 1; printf ("\t :
"
); printf ("\t : "); scanf ("%s", myName); getchar(); printf ("\t : "); scanf ("%s", msg.msg); getchar(); printf ("\t : "); scanf ("%d", &msg.sig); getchar(); strcpy (msg.fromname, myName); write (socketfd, &msg, sizeof(struct Msg)); // read (socketfd, &msg, sizeof(struct Msg)); // printf ("
\t ......
"
); sleep(1); if (msg.cmd == 1001) { printf ("
\t !
\t ......
"
); } else if (msg.cmd == -1) { printf ("\t ,
"
); } else if (msg.cmd == -2) { printf ("\t ,
"
); } usleep(1500000); } // void ask_server(int socketfd) { char ch[2]; while (1) { interface1(); fgets(ch, 2, stdin); while (getchar()!= '
'
); switch(ch[0]) { case '1': // reg(socketfd); break; case '2': // log_in(socketfd); break; case 'q': // exit(1); } system("clear"); } } int main(int argc, char **argv) { // Histroy.db int ret = sqlite3_open("Histroy.db", &database); if (ret != SQLITE_OK) { printf ("
"
); return -1; } // histroy char *errmsg = NULL; char *sql = "create table if not exists histroy(fromname TEXT,toname TEXT,msg TEXT)"; ret = sqlite3_exec(database, sql, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return -1; } // sqlite3_close(database); // int socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { perror ("socket"); return -1; } // struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; // addr.sin_port = htons(PORT); // inet_aton(argv[1],&(addr.sin_addr)); // , , 0, , -1 // , socketfd ret = connect(socketfd, (struct sockaddr *)&addr, sizeof(addr)); if (ret == -1) { perror ("connect"); return -1; } printf ("
"
); ask_server(socketfd); // close(socketfd); return 0; }
Server.cソースファイル
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  

#define PORT  9999

sqlite3 * database;

//   
struct Msg
{
    char msg[1024];         //     
    int  cmd;               //     
    char filename[50];      //      
    char toname[20];        //      
    char fromname[20];      //      
    int  sig;               //     (0:   、1:    、2:   )
};

//       ,       
int init_socket()
{
    //1、  socket
    int listen_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (listen_socket == -1)
    {
        perror ("socket");
        return -1;
    }

    // 2、     ,     ip     
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_family  = AF_INET;     //      
    addr.sin_port    = htons(PORT); //       
    addr.sin_addr.s_addr = htonl(INADDR_ANY);   //        IP  

    int  ret = bind(listen_socket,  (struct sockaddr *)&addr, sizeof(addr));
    if (ret == -1)
    {
        perror ("bind");
        return -1;
    }

    // 3、       
    ret = listen(listen_socket, 5);
    if (ret == -1)
    {
        perror ("listen");
        return -1;
    }

    printf ("      ,       .......
"
); return listen_socket; } // , int MyAccept(int listen_socket) { // 4、 struct sockaddr_in client_addr; // ip int len = sizeof(client_addr); int client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, &len); if (client_socket == -1) { perror ("accept"); } printf (" : %s
"
, inet_ntoa(client_addr.sin_addr)); return client_socket; } // void display (int client_socket, struct Msg *msg) { printf ("
"
); // flag // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); msg->cmd = -2; write (client_socket, msg, sizeof(struct Msg)); return; } // User char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from User"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); msg->cmd = -1; write (client_socket, msg, sizeof(struct Msg)); return; } int count = 0; int i; for (i = 3+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], "1") == 0) { count++; } } // msg->cmd = count; printf (" :%d
"
, msg->cmd); write (client_socket, msg, sizeof(struct Msg)); sqlite3_free_table(resultp); // sqlite3_close(database); printf (" ,
"
); } // , void quit_chatroom (int client_socket, struct Msg *msg) { printf ("%s
"
, msg->fromname); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); return; } char buf[100]; char *errmsg = NULL; errmsg = NULL; sprintf (buf, "update user set flag = 0 where name = '%s'",msg->fromname); ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } sqlite3_close(database); printf (" ,
"
); write (client_socket, msg, sizeof(struct Msg)); } // void chat1 (int client_socket, struct Msg *msg) { printf ("%s
"
,msg->fromname); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); msg->cmd = -2; write (client_socket, msg, sizeof(struct Msg)); return; } // flag char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from User"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); msg->cmd = -1; write (client_socket, msg, sizeof(struct Msg)); return; } int i; for (i = 3+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { // if(strcmp(resultp[i], "1") == 0) { msg->cmd = 9001; write (atoi(resultp[i-1]), msg, sizeof(struct Msg)); } } printf ("
"
); } // void chat2 (int client_socket, struct Msg *msg) { printf ("%s %s
"
,msg->fromname,msg->toname); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); msg->cmd = -2; write (client_socket, msg, sizeof(struct Msg)); return; } // flag , char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from User"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); msg->cmd = -1; write (client_socket, msg, sizeof(struct Msg)); return; } int i; for (i = 0+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], msg->toname)==0 && strcmp(resultp[i+3], "1")== 0) { msg->cmd = 9002; write (atoi(resultp[i+2]), msg, sizeof(struct Msg)); return; } } msg->cmd = 9003; write (client_socket, msg, sizeof(struct Msg)); } // void convey_confirm (int client_socket, struct Msg *msg) { printf ("%s %s
"
,msg->fromname,msg->toname); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); return; } // flag char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from User"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } int i; for (i = 0+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], msg->toname)==0 && strcmp(resultp[i+3], "1")== 0) { msg->cmd = 9004; write (atoi(resultp[i+2]), msg, sizeof(struct Msg)); return; } } msg->cmd = 9003; write (client_socket, msg, sizeof(struct Msg)); } // void refuse (int client_socket, struct Msg *msg) { printf ("%s %s
"
,msg->fromname,msg->toname); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); return; } // toname char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from User"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } int i; for (i = 0+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], msg->toname)==0 && strcmp(resultp[i+3], "1")== 0) { write (atoi(resultp[i+2]), msg, sizeof(struct Msg)); return; } } msg->cmd = 9003; write (client_socket, msg, sizeof(struct Msg)); } // void accept_ (int client_socket, struct Msg *msg) { printf ("%s %s
"
,msg->fromname,msg->toname); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); return; } // toname char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from User"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } int i; for (i = 0+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], msg->toname)==0 && strcmp(resultp[i+3], "1")== 0) { write (atoi(resultp[i+2]), msg, sizeof(struct Msg)); return; } } msg->cmd = 9003; write (client_socket, msg, sizeof(struct Msg)); } // void convey_chose (int client_socket, struct Msg *msg) { printf ("%s %s ......
"
,msg->fromname,msg->toname); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); msg->cmd = -2; write (client_socket, msg, sizeof(struct Msg)); return; } // flag , char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from User"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); msg->cmd = -1; write (client_socket, msg, sizeof(struct Msg)); return; } // toname int i; for (i = 0+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], msg->toname)==0 && strcmp(resultp[i+3], "1")== 0) { write (atoi(resultp[i+2]), msg, sizeof(struct Msg)); return; } } msg->cmd = 9003; write (client_socket, msg, sizeof(struct Msg)); } // void convey_complete (int client_socket, struct Msg *msg) { printf ("
"
); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); msg->cmd = -2; write (client_socket, msg, sizeof(struct Msg)); return; } // flag , char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from User"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); msg->cmd = -1; write (client_socket, msg, sizeof(struct Msg)); return; } // toname int i; for (i = 0+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], msg->toname)==0 && strcmp(resultp[i+3], "1")== 0) { write (atoi(resultp[i+2]), msg, sizeof(struct Msg)); return; } } msg->cmd = 9003; write (client_socket, msg, sizeof(struct Msg)); } // void change_pass (int client_socket, struct Msg *msg) { printf ("%s
"
, msg->fromname); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); msg->cmd = -2; write (client_socket, msg, sizeof(struct Msg)); return; } // User char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from user"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } int i; for (i = 0+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], msg->fromname)==0 && strcmp(resultp[i+1], msg->msg)==0) { // msg->cmd = 9009; printf ("%s
"
, msg->fromname); write (client_socket, msg, sizeof(struct Msg)); // char buf[100]; errmsg = NULL; sprintf (buf, "update user set password = '%s' where name = '%s'",msg->filename,msg->fromname); ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } sqlite3_free_table(resultp); // sqlite3_close(database); printf (" ,
"
); return; } } printf ("%s ,
"
, msg->fromname); msg->cmd = 9010; write (client_socket, msg, sizeof(struct Msg)); sqlite3_free_table(resultp); // sqlite3_close(database); printf (" ,
"
); } // void delete_user (int client_socket, struct Msg *msg) { printf ("
"
); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); return; } // user char buf[100]; char *errmsg = NULL; sprintf (buf, "delete from user where name = '%s'", msg->fromname); ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } // sqlite3_close(database); printf (" ,
"
); } // void silent (int client_socket, struct Msg *msg) { printf (" %s %s
"
,msg->fromname,msg->toname); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); msg->cmd = -2; write (client_socket, msg, sizeof(struct Msg)); return; } // flag , char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from User"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); msg->cmd = -1; write (client_socket, msg, sizeof(struct Msg)); return; } // toname int i; for (i = 0+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], msg->toname)==0 && strcmp(resultp[i+3], "1")== 0) { msg->cmd = 9011; write (atoi(resultp[i+2]), msg, sizeof(struct Msg)); char buf[100]; errmsg = NULL; sprintf (buf, "update user set sig = 2 where name = '%s'",msg->toname); ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } sqlite3_close(database); printf (" ,
"
); return; } } msg->cmd = 9003; write (client_socket, msg, sizeof(struct Msg)); sqlite3_close(database); printf (" , ,
"
); } // void silent_del (int client_socket, struct Msg *msg) { printf (" %s %s
"
,msg->fromname,msg->toname); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); msg->cmd = -2; write (client_socket, msg, sizeof(struct Msg)); return; } // flag , char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from User"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); msg->cmd = -1; write (client_socket, msg, sizeof(struct Msg)); return; } // toname int i; for (i = 0+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], msg->toname)==0 && strcmp(resultp[i+3], "1")== 0) { msg->cmd = 9012; write (atoi(resultp[i+2]), msg, sizeof(struct Msg)); char buf[100]; errmsg = NULL; sprintf (buf, "update user set sig = 1 where name = '%s'",msg->toname); ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } sqlite3_close(database); printf (" ,
"
); return; } } msg->cmd = 9003; write (client_socket, msg, sizeof(struct Msg)); sqlite3_close(database); printf (" , ,
"
); } // void kickout (int client_socket, struct Msg *msg) { printf (" %s %s
"
,msg->fromname,msg->toname); // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); msg->cmd = -2; write (client_socket, msg, sizeof(struct Msg)); return; } // flag , char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from User"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } // toname int i; for (i = 0+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], msg->toname)==0 && strcmp(resultp[i+3], "1")== 0) { msg->cmd = 9013; write (atoi(resultp[i+2]), msg, sizeof(struct Msg)); char buf[100]; errmsg = NULL; sprintf (buf, "update user set flag = 0 where name = '%s'",msg->toname); ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return; } sqlite3_close(database); printf (" ,
"
); return; } } msg->cmd = 9003; write (client_socket, msg, sizeof(struct Msg)); sqlite3_close(database); printf (" , ,
"
); } // void user_do (int client_socket) { struct Msg msg; int sig = 0; while(1) { // int ret = read(client_socket, &msg, sizeof(msg)); if (ret == -1) { perror ("read"); break; } // if (ret == 0) { printf ("
"
); break; } switch (msg.cmd) { case 10: // , quit_chatroom(client_socket, &msg); sig = 1; break; case 1 : // display (client_socket, &msg); break; case 2 : // chat1 (client_socket, &msg); break; case 3 : // chat2 (client_socket, &msg); break; case 5 : // convey_confirm (client_socket, &msg); break; case 6 : // change_pass (client_socket, &msg); break; case 8 : // delete_user (client_socket, &msg); break; case 9005 : // refuse (client_socket, &msg); break; case 9006 : // accept_ (client_socket, &msg); break; case 9007 : // convey_chose (client_socket, &msg); break; case 9008 : // convey_complete (client_socket, &msg); break; case 9011: // silent (client_socket, &msg); break; case 9012: // silent_del (client_socket, &msg); break; case 9013: // kickout (client_socket, &msg); break; } if (sig == 1) { printf("
"
); break; } } } // void log_in(int client_socket, struct Msg *msg) { printf ("%s
"
, msg->fromname); // // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); msg->cmd = -2; write (client_socket, msg, sizeof(struct Msg)); return; } // User char *errmsg = NULL; char **resultp = NULL; int nrow, ncolumn; char *sql = "select * from user"; ret = sqlite3_get_table(database, sql, &resultp, &nrow, &ncolumn, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); msg->cmd = -1; write (client_socket, msg, sizeof(struct Msg)); return; } int i; for (i = 0+ncolumn; i < (nrow+1)*ncolumn; i+=ncolumn) { if(strcmp(resultp[i], msg->fromname)==0 && strcmp(resultp[i+1], msg->msg)==0) { if (strcmp(resultp[i+3], "1") == 0) { msg->cmd = -4; printf ("%s
"
, msg->fromname); write (client_socket, msg, sizeof(struct Msg)); sqlite3_free_table(resultp); // sqlite3_close(database); printf (" ,
"
); return; } if (strcmp(resultp[i+4], "0") != 0) { // msg->cmd = 1002; msg->sig = atoi(resultp[i+4]); printf (" %s
"
, msg->fromname); write (client_socket, msg, sizeof(struct Msg)); } else { // msg->cmd = 1003; msg->sig = atoi(resultp[i+4]); printf (" %s
"
, msg->fromname); write (client_socket, msg, sizeof(struct Msg)); } // 、 char buf[100]; errmsg = NULL; sprintf (buf, "update user set socket = '%d',flag = 1 where name = '%s'",client_socket,msg->fromname); ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); msg->cmd = -1; write (client_socket, msg, sizeof(struct Msg)); return; } sqlite3_free_table(resultp); // sqlite3_close(database); printf (" ,
"
); printf ("
"
); user_do (client_socket); return; } } printf ("%s
"
, msg->fromname); msg->cmd = -3; write (client_socket, msg, sizeof(struct Msg)); sqlite3_free_table(resultp); // sqlite3_close(database); printf (" ,
"
); } // void reg(int client_socket, struct Msg *msg) { printf ("%s
"
, msg->fromname); // // int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); msg->cmd = -2; write (client_socket, msg, sizeof(struct Msg)); return; } // User char buf[100]; char *errmsg = NULL; sprintf (buf, "insert into user values('%s','%s',%d,%d,%d)",msg->fromname,msg->msg,client_socket,0,msg->sig); ret = sqlite3_exec(database, buf, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); msg->cmd = -1; write (client_socket, msg, sizeof(struct Msg)); return; } // msg->cmd = 1001; printf ("%s
"
, msg->fromname); write (client_socket, msg, sizeof(struct Msg)); // sqlite3_close(database); printf (" ,
"
); } // , void* hanld_client(void* v) { int client_socket = (int)v; struct Msg msg; while(1) { printf("
"
); // int ret = read(client_socket, &msg, sizeof(msg)); if (ret == -1) { perror ("read"); break; } // if (ret == 0) { printf ("
"
); break; } switch (msg.cmd) { case 1 : // reg(client_socket, &msg); break; case 2 : // log_in(client_socket, &msg); break; } } close (client_socket); } int main() { // User.db int ret = sqlite3_open("User.db", &database); if (ret != SQLITE_OK) { printf ("
"
); return -1; } // user char *errmsg = NULL; char *sql = "create table if not exists user(name TEXT,password TEXT,socket INTEGER,flag INTEGER,sig INTEGER,primary key(name))"; ret = sqlite3_exec(database, sql, NULL, NULL, &errmsg); if (ret != SQLITE_OK) { printf (" :%s
"
, errmsg); return -1; } printf (" ......
"
); // sqlite3_close(database); // int listen_socket = init_socket(); while (1) { // int client_socket = MyAccept(listen_socket); // , pthread_t id; pthread_create(&id, NULL, hanld_client, (void *)client_socket); pthread_detach(id); // } close (listen_socket); return 0; }