ネットワークプログラミング項目(チャットルーム項目)
一、目標を実現する
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ソースファイルです。
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;
}