共分为四部分,服务器两个,客户端两个
1.my_sever.c
//******************************************************//
//鐢熸垚鏃ユ湡 2017骞?2鏈?4鏃? 浣滆€?闄堝浆 //
//璇ユ枃浠朵负鑱婂ぉ瀹ゆ湇鍔″櫒涓荤▼搴忥紝涓昏杩涜濂楁帴瀛楃殑寤虹珛锛岀粦瀹氾紝浠ュ強瀵瑰鎴风鐨勭洃鍚粠鑰屽疄鐜板悇绉嶅姛鑳?/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#include<unistd.h>
#include<sys/time.h>
#include<sys/select.h>
#include"my_chat.h"
#include<sqlite3.h>
#define PORT 8888
int main()
{
int sockfd, ret, i = 0, j, length, k, location, num = 0, n;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
struct info Recvbuf;
fd_set ReadFd, TmpFd;
int MaxFd;
int fd[100];
sqlite3* pdb;
Linklist list;
ret = ListInit(&list);
if (ERROR == ret)
{
printf("Init failed!\n");
}
sockfd = socket(PF_INET, SOCK_STREAM, 0); //寤虹珛Socket
if (-1 == sockfd)
{
perror("socket");
exit(1);
}
memset(&server_addr, 0, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = PORT;
server_addr.sin_addr.s_addr = inet_addr("192.168.159.128");
int opt = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
ret = bind(sockfd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in));//缁戝畾
if (-1 == ret)
{
perror("bind");
exit(1);
}
ret = listen(sockfd, 10); //鐩戝惉
if (-1 == ret)
{
perror("listen");
exit(1);
}
ret = sqlite3_open("alluser.db", &pdb); //鎵撳紑瀛樻斁鎵€浠ヨ亰澶╄褰曠殑鏁版嵁搴? if (SQLITE_OK != ret)
{
perror("sqlite3_open");
exit(1);
}
FD_ZERO(&ReadFd);
FD_ZERO(&TmpFd);
FD_SET(sockfd, &ReadFd);
MaxFd = sockfd;
while(1)
{
TmpFd = ReadFd;
ret = select(MaxFd + 1, &TmpFd, NULL, NULL, NULL);
if (-1 == ret)
{
perror("select");
exit(1);
}
if (FD_ISSET(sockfd, &TmpFd))
{
length = sizeof(client_addr);
fd[i] = accept(sockfd, (struct sockaddr*)&client_addr, &length);
if (-1 == fd[i])
{
perror("accept");
exit(1);
}
printf("Accept:%d Port:%d\n", fd[i], client_addr.sin_port);
FD_SET(fd[i], &ReadFd);
for (k = 0; k <= i; k++)
{
if (fd[k] > MaxFd)
{
MaxFd = fd[k];
}
}
i++;
}
else
{
for (j = 0; j < i; j++)
{
if (FD_ISSET(fd[j], &TmpFd))
{
memset(&Recvbuf, 0, sizeof(Recvbuf));
ret = recv(fd[j], &Recvbuf, sizeof(Recvbuf), 0);//鎺ユ敹瀹㈡埛绔彂閫佺殑淇℃伅
if (-1 == ret)
{
perror("recv");
exit(1);
}
if (Recvbuf.idlist == 1)
{
/*鍑芥暟鍚嶏細search 鍔熻兘锛氬垽鏂甯愬彿鏄惁宸茬粡鐧诲綍 鍙傛暟锛氬湪绾縤d鐨勪俊鎭摼琛紝
瀹㈡埛绔殑fd锛屽瓨鏀炬帴鏀朵俊鎭殑缁撴瀯浣?/
ret = search(list, Recvbuf.id, fd[j]);
if (ret == ERROR)
{
printf("search failed!\n");
}
}
else if (Recvbuf.namelist == 1) //灏嗙綉鍚嶏紝fd鍜宨d甯愬彿瀛樺叆閾捐〃
{
ret = ListInsert(list, 1, fd[j], Recvbuf);
if (ret == ERROR)
{
printf("Insert failed!\n");
}
ret = send(fd[j], &Recvbuf, sizeof(Recvbuf), 0);
if (-1 == ret)
{
perror("sendname");
exit(1);
}
break;
}
else if (Recvbuf.look_online == 1)
{
/*鍑芥暟鍚嶏細lookonline 鍔熻兘锛氭煡鐪嬪湪绾垮ソ鍙嬩俊鎭紝骞朵紶閫佸洖瀹㈡埛绔? 鍙傛暟锛氫俊鎭摼琛紝瀹㈡埛绔痜d锛岀粨鏋勪綋*/
ret = lookonline(list, fd[j], Recvbuf);
if (ret == ERROR)
{
printf("look failed!\n");
}
break;
}
else if (Recvbuf.chat_personal == 1)
{
/*鍑芥暟鍚嶏細chatpersonal 鍔熻兘瀹炵幇绉佽亰鍔熻兘锛屽嵆淇℃伅鐨勮浆鍙? 鍙傛暟锛氬鎴风fd锛岀粨鏋勪綋锛岃亰澶╄褰曟暟鎹簱pdb锛屼俊鎭摼琛?/
ret = chatpersonal(fd[j], Recvbuf, list, pdb);
if (ret == ERROR)
{
printf("chat personal failed!\n");
}
break;
}
else if (Recvbuf.chat_all == 1)
{
/*鍑芥暟鍚嶏細chatall 鍔熻兘锛氬疄鐜扮兢鍙戝姛鑳斤紝鍗冲皢淇℃伅杞彂缁欐墍浠ュ湪绾跨敤鎴? 鍙傛暟锛氬鎴风fd锛岀粨鏋勪綋锛岃亰澶╄褰曟暟鎹簱pdb锛屼俊鎭摼琛?/
ret = chatall(fd[j], Recvbuf, list, pdb);
if (ret == ERROR)
{
printf("chat all people failed!\n");
}
break;
}
else if (Recvbuf.shutup == 1)
{
/*鍑芥暟鍚嶏細shutup 鍔熻兘锛氱瑷€ 鍙傛暟锛氬鎴风fd锛屼俊鎭摼琛紝缁撴瀯浣?/
ret = shutup(fd[j], Recvbuf, list);
if (ret == ERROR)
{
printf("Shutup failed!\n");
}
break;
}
else if (Recvbuf.speakout == 1)
{
/*鍑芥暟鍚嶏細shutup 鍔熻兘锛氱瑷€ 鍙傛暟锛氬鎴风fd锛屼俊鎭摼琛紝缁撴瀯浣?/
ret = speakout(fd[j], Recvbuf, list);
if (ret == ERROR)
{
printf("Speakout failed!\n");
}
break;
}
else if (Recvbuf.kickout == 1)
{
/*鍑芥暟鍚嶏細kickout 鍔熻兘锛氬皢鏌愮敤鎴疯涪鍑鸿亰澶╁锛岀粨鏉熷叾杩涚▼*/
ret = kickout(fd[j], Recvbuf, list);
if (ret == ERROR)
{
printf("Kickout failed!\n");
break;
}
else
{
close(ret);
FD_CLR(ret, &ReadFd);
location = Location(list, ret); //瀹氫綅璇ョ敤鎴凤紝纭畾鍏舵墍鍦ㄤ俊鎭摼琛ㄧ殑浣嶇疆
ret = ListDelete(list, location);//鍒犻櫎璇ョ敤鎴锋墍鍦ㄩ摼琛ㄤ俊鎭? if (ERROR == ret)
{
printf("Delete failed!\n");
break;
}
MaxFd = 5; //閲嶆柊纭畾姝ゆ椂鐨凪axFd鐨勫€硷紝纭繚鏄渶澶х殑fd鐨勫€? for (k = 0; k < i; k++)
{
/*if (fd[k] == ret)
{
continue;
}*/
if (fd[k] > MaxFd)
{
MaxFd = fd[k];
}
}
}
break;
}
else if (Recvbuf.esc == 1)
{
//澶勭悊閫€鍑洪€夐」浠ュ強ctrl c淇″彿锛?鍙戜俊鍙风粰瀹㈡埛绔紝浣垮叾鍏抽棴fd
memset(&Recvbuf, 0, sizeof(Recvbuf));
Recvbuf.esc = 1;
ret = send(fd[j], &Recvbuf, sizeof(Recvbuf), 0);
if (-1 == ret)
{
perror("send1");
exit(1);
}
close(fd[j]);
FD_CLR(fd[j], &ReadFd);
location = Location(list, fd[j]); //瀹氫綅鍏跺湪閾捐〃浣嶇疆
ret = ListDelete(list, location); //鍒犻櫎涓汉淇℃伅
if (ERROR == ret)
{
printf("Delete failed!\n");
break;
}
MaxFd = 5; //閲嶆柊纭畾MaxFd
for (k = 0; k < i; k++)
{
/*if (k == j)
{
continue;
}*/
if (fd[k] > MaxFd)
{
MaxFd = fd[k];
}
}
break;
}
else if (Recvbuf.quit == 1)
{ //澶勭悊鍦ㄧ櫥褰曠晫闈㈢殑閫€鍑洪€夐」
close(fd[j]); //鍏抽棴鐩稿簲fd
FD_CLR(fd[j], &ReadFd);
break;
}
break;
}
}
}
}
return 0;
}
2.sever.c
//******************************************************//
//鐢熸垚鏃ユ湡 2017骞?2鏈?4鏃? 浣滆€?闄堝浆 //
//璇ユ枃浠朵负鑱婂ぉ瀹ゆ湇鍔″櫒瀛愮▼搴忥紝涓昏杩涜瀹㈡埛绔悇椤瑰姛鑳界殑瀹炵幇//
#include<stdio.h>
#include"my_chat.h"
#include<stdlib.h>
#include<string.h>
#include<sqlite3.h>
int ListInit(Linklist* L)
{
*L = (Linklist)malloc(sizeof(Node));
if (*L == NULL)
{
return ERROR;
}
(*L)->next = NULL;
return OK;
}
/*鍑芥暟鍚嶏細search 鍔熻兘锛氬垽鏂甯愬彿鏄惁宸茬粡鐧诲綍 鍙傛暟锛氬湪绾縤d鐨勪俊鎭摼琛紝
瀹㈡埛绔殑fd锛屽瓨鏀炬帴鏀朵俊鎭殑缁撴瀯浣?/
int search(Linklist L, char* id, int fd)
{
if (NULL == L)
{
return ERROR;
}
struct info Sendbuf;
Linklist p = L;
int exist = 0, ret;
while(p->next)
{
p = p->next;
if (!strcmp(p->Id, id))
{
exist = 1;
break;
}
}
if (exist == 1)
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.not_exist = 1;
ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
return OK;
}
else
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.not_exist = 0;
ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
return OK;
}
}
int ListInsert(Linklist L, int k, int fd, struct info Recvbuf)
{
if (NULL == L)
{
return ERROR;
}
int j = 1;
Linklist p = L;
while (p && j < k)
{
p = p->next;
j++;
}
if (!p || j > k)
{
return ERROR;
}
Linklist s = (Linklist)malloc(sizeof(Node));
s->Fd = fd;
strcpy(s->Id, Recvbuf.id);
strcpy(s->Name, Recvbuf.name);
s->next = p->next;
p->next = s;
return OK;
}
/*鍑芥暟鍚嶏細lookonline 鍔熻兘锛氭煡鐪嬪湪绾垮ソ鍙嬩俊鎭紝骞朵紶閫佸洖瀹㈡埛绔?鍙傛暟锛氫俊鎭摼琛紝瀹㈡埛绔痜d锛岀粨鏋勪綋*/
int lookonline(Linklist L, int fd, struct info Recvbuf)
{
if (NULL == L)
{
return ERROR;
}
Linklist p = L;
struct info Sendbuf;
int ret;
memset(&Sendbuf, 0, sizeof(Sendbuf));
while(p->next != NULL)
{
p = p->next;
strcat(Sendbuf.buf, p->Name);
strcat(Sendbuf.buf, " ");
}
Sendbuf.look_online = 1;
ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
return OK;
}
/*鍑芥暟鍚嶏細chatpersonal 鍔熻兘瀹炵幇绉佽亰鍔熻兘锛屽嵆淇℃伅鐨勮浆鍙?鍙傛暟锛氬鎴风fd锛岀粨鏋勪綋锛岃亰澶╄褰曟暟鎹簱pdb锛屼俊鎭摼琛?/
int chatpersonal(int fd, struct info Recvbuf, Linklist L, sqlite3* pdb)
{
char from_name[100] = {0};
char to_name[100] = {0};
char sql[100] = {0};
char record[100] = {0};
int to_fd;
Linklist p = L;
int ret, exist = 0;
struct info Sendbuf;
memset(sql, 0, sizeof(sql));
sprintf(sql, "create table if not exists alluser (chatinfo text);");
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec1");
exit(1);
}
while(p->next)
{
p = p->next;
if (fd == p->Fd)
{
//printf("%s\n", p->Name);
strcpy(from_name, p->Name);
break;
}
}
p = L;
while(p->next)
{
p = p->next;
if (!strcmp(Recvbuf.name, p->Name))
{
exist = 1;
to_fd = p->Fd;
memset(&Sendbuf, 0, sizeof(Sendbuf));
strcpy(Sendbuf.name, from_name);
strcpy(Sendbuf.buf, Recvbuf.buf);
Sendbuf.chat_personal = 1;
ret = send(to_fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
memset(record, 0, sizeof(record));
strcpy(record, from_name);
strcat(record, "鍚?);
strcat(record, Recvbuf.name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into alluser (chatinfo) values ('%s');", record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
}
}
if (exist == 0)
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.not_exist = 1;
ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
return ERROR;
}
return OK;
}
/*鍑芥暟鍚嶏細chatall 鍔熻兘锛氬疄鐜扮兢鍙戝姛鑳斤紝鍗冲皢淇℃伅杞彂缁欐墍浠ュ湪绾跨敤鎴?鍙傛暟锛氬鎴风fd锛岀粨鏋勪綋锛岃亰澶╄褰曟暟鎹簱pdb锛屼俊鎭摼琛?/
int chatall(int fd, struct info Recvbuf, Linklist L, sqlite3* pdb)
{
if (NULL == L)
{
return ERROR;
}
char from_name[100] = {0};
char sql[100] = {0};
char record[100] = {0};
Linklist p = L;
int ret;
struct info Sendbuf;
while(p->next)
{
p = p->next;
if (fd == p->Fd)
{
strcpy(from_name, p->Name);
break;
}
}
memset(sql, 0, sizeof(sql));
sprintf(sql, "create table if not exists alluser (chatinfo text);");
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec1");
exit(1);
}
p = L;
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_all = 1;
strcpy(Sendbuf.name, from_name);
strcpy(Sendbuf.buf, Recvbuf.buf);
while(p->next)
{
p = p->next;
if (p->Fd == fd)
{
continue;
}
ret = send(p->Fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
}
memset(record, 0, sizeof(record));
strcpy(record, from_name);
strcat(record, "鍚?);
strcat(record, "澶у");
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into alluser (chatinfo) values ('%s');", record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
return OK;
}
//瑙i櫎绂佽█
int speakout(int fd, struct info Recvbuf, Linklist L)
{
if (NULL == L)
{
return ERROR;
}
char from_name[100] = {0};
Linklist p = L;
int ret, to_fd;
int exist = 0;
struct info Sendbuf;
while(p->next)
{
p = p->next;
if (fd == p->Fd)
{
strcpy(from_name, p->Name);
break;
}
}
p = L;
while(p->next)
{
p = p->next;
if (!strcmp(Recvbuf.name, p->Name))
{
to_fd = p->Fd;
exist = 1;
memset(&Sendbuf, 0, sizeof(Sendbuf));
strcpy(Sendbuf.name, from_name);
Sendbuf.speakout = 1;
strcpy(Sendbuf.buf, "宸插皢瑙i櫎浣犵瑷€锛?);
ret = send(to_fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
}
}
if (exist == 0)
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.not_exist = 1;
ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
return ERROR;
}
return OK;
}
/*鍑芥暟鍚嶏細shutup 鍔熻兘锛氱瑷€ 鍙傛暟锛氬鎴风fd锛屼俊鎭摼琛紝缁撴瀯浣?/
int shutup(int fd, struct info Recvbuf, Linklist L)
{
if (NULL == L)
{
return ERROR;
}
char from_name[100] = {0};
Linklist p = L;
int ret, to_fd;
int exist = 0;
struct info Sendbuf;
while(p->next)
{
p = p->next;
if (fd == p->Fd)
{
strcpy(from_name, p->Name);
break;
}
}
p = L;
while(p->next)
{
p = p->next;
if (!strcmp(Recvbuf.name, p->Name))
{
to_fd = p->Fd;
exist = 1;
memset(&Sendbuf, 0, sizeof(Sendbuf));
strcpy(Sendbuf.name, from_name);
Sendbuf.speak = 1;
strcpy(Sendbuf.buf, "宸插皢浣犵瑷€锛?);
ret = send(to_fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
}
}
if (exist == 0)
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.not_exist = 1;
ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
return ERROR;
}
return OK;
}
/*鍑芥暟鍚嶏細kickout 鍔熻兘锛氬皢鏌愮敤鎴疯涪鍑鸿亰澶╁锛岀粨鏉熷叾杩涚▼*/
int kickout(int fd, struct info Recvbuf, Linklist L)
{
if (NULL == L)
{
return ERROR;
}
char from_name[100] = {0};
Linklist p = L;
int ret, to_fd;
int exist = 0;
struct info Sendbuf;
while(p->next)
{
p = p->next;
if (fd == p->Fd)
{
strcpy(from_name, p->Name);
break;
}
}
p = L;
while(p->next)
{
p = p->next;
if (!strcmp(Recvbuf.name, p->Name))
{
to_fd = p->Fd;
exist = 1;
memset(&Sendbuf, 0, sizeof(Sendbuf));
strcpy(Sendbuf.name, from_name);
Sendbuf.kickout = 1;
strcpy(Sendbuf.buf, "宸插皢浣犺涪鍑鸿亰澶╁锛?);
ret = send(to_fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
}
}
if (exist == 0)
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.not_exist = 1;
ret = send(fd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
return ERROR;
}
return to_fd;
}
int ListDelete(Linklist L, int k)
{
Linklist p = L;
int j = 1;
Linklist l;
if (NULL == L)
{
return ERROR;
}
while (p->next && j < k)
{
p = p->next;
j++;
}
if (!(p->next) || j > k)
{
return ERROR;
}
l = p->next;
p->next = p->next->next;
free(l);
return OK;
}
int Location(Linklist L, int fd)
{
if (NULL == L)
{
return ERROR;
}
int count = 0;
Linklist p = L;
while(p->next)
{
count++;
p = p->next;
if (p->Fd == fd)
{
return count;
}
}
return ERROR;
}
3.my_client.c
//******************************************************//
//鐢熸垚鏃ユ湡 2017骞?2鏈?4鏃? 浣滆€?闄堝浆 //
//璇ユ枃浠朵负鑱婂ぉ瀹ゅ鎴风涓荤▼搴忥紝涓昏杩涜濂楁帴瀛楃殑寤虹珛锛屼笌鏈嶅姟鍣ㄧ殑杩炴帴锛岀敤鎴风殑鐧诲綍娉ㄥ唽锛屼互鍙婅亰澶╁鐨勫悇绉嶅姛鑳界殑瀹炵幇//
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>
#include"my_chat.h"
#include<signal.h>
#include<sqlite3.h>
#define PORT 8888
int speak_flag = 0;
void* receive(void* arg) //绾跨▼鍑芥暟锛屼笉鏂帴鏀舵湇鍔″櫒鍙戦€佺殑淇℃伅
{
int ret;
sqlite3* pdb;
char name1[100] = {0};
char id1[100] = {0};
char sql[100] = {0};
char record[100] = {0};
struct info Recvbuf;
ret = sqlite3_open("user.db", &pdb); //鎵撳紑瀛樻斁涓汉鐢ㄦ埛鑱婂ぉ璁板綍鐨勬暟鎹簱
if (SQLITE_OK != ret)
{
perror("sqlite3_open");
exit(1);
}
while(1)
{
int ret;
memset(&Recvbuf, 0, sizeof(Recvbuf));
ret = recv(*(int*)arg, &Recvbuf, sizeof(Recvbuf), 0); //涓嶆柇鎺ユ敹鏈嶅姟鍣ㄥ彂閫佺殑娑堟伅
if (-1 == ret)
{
perror("recv");
return;
}
if (Recvbuf.namelist == 1) //閫氳繃鏈嶅姟鍣ㄦ潵鑾峰彇鐧诲綍鍑芥暟鎵€鏀堕泦鐨勭敤鎴风綉鍚嶅拰
{ //鐢ㄦ埛id鐨勪俊鎭? strcpy(name1, Recvbuf.name);
strcpy(id1, Recvbuf.id);
}
if (Recvbuf.look_online == 1) //瀹炵幇鏌ョ湅鍦ㄧ嚎濂藉弸鍔熻兘锛屽苟灏嗗叾鎵撳嵃
{
printf("\n鍦ㄧ嚎濂藉弸:%s\n", Recvbuf.buf);
sleep(3);
}
else if (Recvbuf.not_exist == 1) //鑻ュ彂閫佷俊鎭椂鍑虹幇涓嶅瓨鍦ㄧ殑缃戝悕鍒欐墦鍗? {
printf("\n瀵逛笉璧凤紝璇ュソ鍙嬩笉瀛樺湪\n");
sleep(2);
}
else if (Recvbuf.chat_personal == 1) //瀹炵幇瀵圭鑱婁俊鎭殑鎺ユ敹锛屽苟鎵撳嵃鍙戦€佽€呭拰鍐呭
{
memset(record, 0, sizeof(record));
strcpy(record, Recvbuf.name);
strcat(record, "鍚?);
strcat(record, name1);
strcat(record, "鍙戦€佷簡:");
strcat(record, Recvbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL); //灏嗘璁板綍瀛樺叆鏁版嵁搴? if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
printf("\n\t\t\t\t\t\t鏂版秷鎭細\n\t\t\t\t\t\t%s : %s\n", Recvbuf.name, Recvbuf.buf);
}
else if (Recvbuf.chat_all == 1) //瀵圭兢鑱婁俊鎭殑鎺ユ敹
{
printf("\n\t\t\t\t\t\t鏂版秷鎭?\n\t\t\t\t\t\t%s 鍚戝ぇ瀹跺彂閫佷簡娑堟伅:%s\n",
Recvbuf.name, Recvbuf.buf);
sleep(2);
}
else if (Recvbuf.speak == 1) //鑻ヨ绂佽█锛屽垯鎵撳嵃绂佽█鑰呯綉鍚? {
speak_flag = 1;
printf("\n\n%s%s\n", Recvbuf.name, Recvbuf.buf);
sleep(2);
}
else if (Recvbuf.speakout == 1) //鑻ヨ绂佽█锛屽垯鎵撳嵃绂佽█鑰呯綉鍚? {
speak_flag = 0;
printf("\n\n%s%s\n", Recvbuf.name, Recvbuf.buf);
sleep(2);
}
else if (Recvbuf.kickout == 1) //鑻ヨ韪㈠嚭鑱婂ぉ瀹わ紝鎵撳嵃韪綘鐨勪汉缃戝悕
{
printf("\n\n%s%s\n", Recvbuf.name, Recvbuf.buf);
break;
}
else if (Recvbuf.esc == 1) //鎺ユ敹鏉ヨ嚜鐧诲綍鐣岄潰鐨勯€€鍑轰俊鎭? {
break;
}
}
close(*(int*)arg);
kill(getpid(), SIGSTOP);
}
int main()
{
int sockfd, ret;
struct info Sendbuf;
struct sockaddr_in server_addr;
pthread_t tid;
char buf[100] = {0};
char name[100] = {0};
sockfd = socket(PF_INET, SOCK_STREAM, 0); //寤虹珛socket
if (-1 == sockfd)
{
perror("socket");
exit(1);
}
printf("Start Server!\n");
memset(&server_addr, 0, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_port = PORT;
server_addr.sin_addr.s_addr = inet_addr("192.168.159.128");
ret = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); //涓庢湇鍔″櫒杩炴帴
if (-1 == ret)
{
perror("connect");
exit(1);
}
logininterface(sockfd); //鐧诲綍鐣岄潰鍑芥暟锛屽疄鐜版敞鍐岀櫥褰曠瓑鍔熻兘
sleep(2);
ret = pthread_create(&tid, 0, receive, (void*)&sockfd); //鍒涘缓涓€涓嚎绋嬬敤鏉ヤ笉鏂帴鏀朵俊鎭? if (ret != 0)
{
perror("create");
exit(1);
}
funinterface(sockfd); //璋冪敤鎵€鏈夊姛鑳界殑鍑芥暟
return 0;
}
4.client.c
//******************************************************//
//鐢熸垚鏃ユ湡 2017骞?2鏈?4鏃? 浣滆€?闄堝浆 //
//璇ユ枃浠朵负鑱婂ぉ瀹ゅ鎴风瀛愮▼搴忥紝涓昏杩涜鐢ㄦ埛鐨勭櫥褰曟敞鍐岋紝浠ュ強鑱婂ぉ瀹ょ殑鍚勭鍔熻兘鐨勫疄鐜?/
#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include<stdlib.h>
#include"my_chat.h"
#include<signal.h>
int id_exist = 0; //鍒ゆ柇杈撳叆鐨刬d鏄惁瀛樺湪
int id_num = 0; //纭畾璇d鍦ㄦ暟鎹簱琛ㄤ腑鐨勪綅缃?int id_num1 = 0;
int name_exist = 0; //鍒ゆ柇璇ョ綉鍚嶆槸鍚﹂噸澶?int password_num = 0; //鍒ゆ柇瀵嗙爜鎵€鍦ㄦ暟鎹簱琛ㄤ腑浣嶇疆锛屼互鎵惧埌鐩稿搴旂殑甯愬彿
int password_right = 0; //鍒ゆ柇瀵嗙爜鏄惁姝g‘
int vip_flag = 0; //鏄惁鏄痸ip鐨勬爣蹇?extern speak_flag; //瀹氫箟鍦ㄥ鎴风涓诲嚱鏁版枃浠朵腑锛屼紶閫掓湇鍔″櫒鐨勭瑷€淇℃伅
char name1[100] = {0}; //瀛樻斁缃戝悕
char id1[100] = {0}; //瀛樻斁id
int Sockfd;
void quit(int sig) //澶勭悊閫€鍑轰俊鍙凤紝 纭繚鍏抽棴鐩稿簲fd
{
printf("姝e湪淇濆瓨淇℃伅......\n");
int ret;
struct info Sendbuf;
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.esc = 1;
ret = send(Sockfd, &Sendbuf, sizeof(Sendbuf), 0); //鍙戦€佺粰鏈嶅姟鍣紝浣垮叾鍏抽棴fd
if (-1 == ret)
{
perror("send");
exit(1);
}
sleep(2);
kill(getpid(), SIGSTOP); //缁撴潫涓诲嚱鏁?}
/*鍑芥暟鍚嶏細name 鍙傛暟锛氳緭鍏ョ殑缃戝悕 鍔熻兘锛氬垽鏂缃戝悕鏄惁宸茬粡瀛樺湪*/
int name(void* para, int columncount, char** columnValue, char** columnName)
{
if (strcmp((char*)para, columnValue[2]) == 0)
{
name_exist = 1;
}
return 0;
}
/*鍑芥暟鍚嶏細idnum 鍙傛暟锛氳緭鍏ョ殑id甯愬彿 鍔熻兘锛氬垽鏂甯愬彿鏄惁宸茬粡瀛樺湪锛岃嫢瀛樺湪纭畾璧锋墍鍦ㄦ暟鎹簱琛ㄤ腑浣嶇疆*/
int idnum(void* para, int columncount, char** columnValue, char** columnName)
{
id_num++;
if (strcmp((char*)para, columnValue[0]) == 0)
{
id_exist = 1;
id_num1 = id_num;
}
return 0;
}
/*鍑芥暟鍚嶏細password 鍙傛暟锛氳緭鍏ョ殑瀵嗙爜 鍔熻兘锛氭壘鍒板笎鍙风浉瀵圭殑瀵嗙爜锛屽苟涓庤緭鍏ヨ繘琛屾瘮杈冿紝鍒ゆ柇杈撳叆瀵嗙爜瀵归敊*/
int passwordnum(void* para, int columncount, char** columnValue, char** columnName)
{
password_num++;
if (password_num == id_num1)
{
if(strcmp((char*)para, columnValue[1]) == 0)
{
password_right = 1;
strcpy(name1, columnValue[2]);
}
}
return 0;
}
/*鍑芥暟鍚嶏細print 鍙傛暟锛氭棤 鍔熻兘锛氭墦鍗板瓨鏀捐亰澶╄褰曠殑鏁版嵁搴撹〃涓墍鏈夊唴瀹?/
int print(void* para, int columncount, char** columnValue, char** columnName)
{
printf("\n");
printf("%s\n", *columnValue);
return 0;
}
int logininterface(int sockfd) //鐧诲綍鐣岄潰鍑芥暟锛屽弬鏁颁负寤虹珛濂界殑sockfd
{ //瀹炵幇鐧诲綍娉ㄥ唽锛屽苟鏃佹柇鐧诲綍鐨刬d鏄惁瀛樺湪锛岃緭鍏ョ殑瀵嗙爜鏄惁姝g‘
sqlite3* pdb; //浠ュ強娉ㄥ唽鏃秈d鏄惁瀛樺湪锛岀綉鍚嶆槸鍚﹂噸澶? int ret, i, age, choose;
char sql[100] = {0};
char id[100] = {0};
Sockfd = sockfd;
char password[100] = {0};
struct info Sendbuf;
struct info Recvbuf;
ret = sqlite3_open("info.db", &pdb);//鎵撳紑瀛樻斁甯愬彿瀵嗙爜缃戝悕淇℃伅鐨勬暟鎹簱
if (SQLITE_OK != ret)
{
perror("sqlite3_open");
exit(1);
}
sprintf(sql, "create table if not exists id_info (id text, password text, name text);");
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL); //寤虹珛涓€寮犲瓨鏀緄d锛屽瘑鐮侊紝缃戝悕鐨勮〃
if (SQLITE_OK != ret)
{
perror("sqlite3_exec1");
exit(1);
}
signal(SIGINT, SIG_IGN); //姝ゆ椂蹇界暐ctrl锛媍淇″彿
while(1)
{
system("clear");
printf("\n\n\n");
printf("***********************************************************\n");
printf("* * * * * * *\n");
printf("* * * * * * *\n");
printf("* * * Welcome! * * * *\n");
printf("* * * * * * *\n");
printf("* * Happy * * Chating! * *\n");
printf("* * * * * * *\n");
printf("* * * * * * * * *\n");
printf("***********************************************************\n");
sleep(2);
system("clear");
printf("\n\n\n");
printf("***********************************************************\n");
printf("* * * * *\n");
printf("* * 1.鐧诲綍甯愬彿 * *\n");
printf("* * * * * 2.娉ㄥ唽甯愬彿 * * *\n");
printf("* * * 3.閫€鍑? * *\n");
printf("* * * * * * * * *\n");
printf("* * (璐﹀彿瀵嗙爜杈撳叆涓緭鍏xit閮藉皢閫€鍑? *\n");
printf("* * * * *\n");
printf("***********************************************************\n");
printf("\n");
ret = scanf("%d", &choose);
if (ret == 0)
{
int ch;
printf("杈撳叆閿欒!\n");
while ((ch = getchar()) != EOF && ch != '\n');
sleep(1);
continue;
}
else if (choose == 1)
{
id_exist = 0;
id_num = 0;
id_num1 = 0;
password_num = 0;
password_right = 0;
system("clear");
printf("\n\n\n\n");
while(1)
{
printf("璇疯緭鍏ュ笎鍙?");
memset(id, 0, sizeof(id));
scanf("%s", id);
if (!strcmp(id, "exit")) //鑻ヨ緭鍏xit锛屽垯杩涜閫€鍑虹郴缁? {
printf("娆㈣繋涓嬫鍐嶆潵!\n");
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.quit = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0); //鍙戦€佺粰鏈嶅姟鍣ㄩ€€鍑轰俊鍙? if (-1 == ret)
{
perror("send");
exit(1);
}
printf("閫€鍑烘垚鍔燂紒\n");
close(sockfd);
sleep(1);
exit(1);
}
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.idlist = 1; //鍒ゆ柇璇ュ笎鍙锋槸鍚﹀凡缁忕櫥褰? strcpy(Sendbuf.id, id);
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
ret = recv(sockfd, &Recvbuf, sizeof(Recvbuf), 0); //鎺ユ敹鏈嶅姟鍣ㄧ殑鍙嶉淇℃伅
if (-1 == ret)
{
perror("recv");
exit(1);
}
if (Recvbuf.not_exist == 1)
{
printf("\n璇ュ笎鍙峰凡鐧诲綍锛乗n");
continue;
}
else if (Recvbuf.not_exist == 0)
{
break;
}
}
sprintf(sql, "select * from id_info;"); //浠庢暟鎹簱涓垽鏂甯愬彿鏄惁瀛樺湪
ret = sqlite3_exec(pdb, sql, idnum, (void*)id, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
if (id_exist == 0)
{
printf("\n閿欒:璇ュ笎鍙蜂笉瀛樺湪!\n");
sleep(2);
}
else
{
memset(password, 0, sizeof(password));
printf("\n璇疯緭鍏ュ瘑鐮?");
scanf("%s", password);
if (!strcmp(password, "exit")) //閫€鍑烘搷浣? {
printf("娆㈣繋涓嬫鍐嶆潵!\n");
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.quit = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("閫€鍑烘垚鍔燂紒\n");
close(sockfd);
sleep(1);
exit(1);
}
sprintf(sql, "select * from id_info;"); //璋冪敤甯愬彿鏁版嵁搴撲俊鎭紝鍒ゆ柇瀵嗙爜鏄惁姝g‘
ret = sqlite3_exec(pdb, sql, passwordnum, (void*)password, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
if (password_right == 0)
{
printf("瀵嗙爜閿欒\n");
sleep(2);
}
else
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.namelist = 1; //瀵嗙爜姝g‘鍚庯紝灏嗕俊鎭瓨鍏ュ湪绾跨敤鎴风殑閾捐〃
strcpy(Sendbuf.name, name1);
strcpy(Sendbuf.id, id);
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
strcpy(id1, id);
printf("\n姝e湪鐧诲綍......\n");
sleep(1);
printf("\n鐧诲綍鎴愬姛锛乗n");
break;
}
}
}
else if (choose == 2)
{
system("clear");
printf("\n\n\n\n");
printf("璇疯緭鍏ュ笎鍙?");
scanf("%s", id);
if (!strcmp(id, "exit"))
{
printf("娆㈣繋涓嬫鍐嶆潵!\n");
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.quit = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("閫€鍑烘垚鍔燂紒\n");
close(sockfd);
sleep(1);
exit(1);
}
sprintf(sql, "select * from id_info;");
ret = sqlite3_exec(pdb, sql, idnum, (void*)id, NULL); //鍒ゆ柇璇ュ笎鍙锋槸鍚﹀瓨鍦? if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
if (id_exist == 1)
{
printf("\n閿欒:璇ュ笎鍙峰凡瀛樺湪!\n\n");
id_exist = 0;
sleep(2);
}
else
{
printf("\n璇疯緭鍏ュ瘑鐮?");
scanf("%s", password);
if (!strcmp(password, "exit"))
{
printf("娆㈣繋涓嬫鍐嶆潵!\n");
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.quit = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("閫€鍑烘垚鍔燂紒\n");
close(sockfd);
sleep(1);
exit(1);
}
printf("\n璇疯緭鍏ョ綉鍚?");
scanf("%s", name1);
if (!strcmp(name1, "exit"))
{
printf("娆㈣繋涓嬫鍐嶆潵!\n");
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.quit = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("閫€鍑烘垚鍔燂紒\n");
close(sockfd);
sleep(1);
exit(1);
}
sprintf(sql, "select * from id_info;");
ret = sqlite3_exec(pdb, sql, name, (void*)name1, NULL); //鍒ゆ柇璇ョ綉鍚嶆槸鍚﹂噸澶? if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
if (name_exist == 1)
{
printf("\n閿欒:璇ョ綉鍚嶅凡瀛樺湪!\n\n");
name_exist = 0;
sleep(1);
}
else //閮芥纭悗锛屽皢鏂扮殑甯愬彿淇℃伅瀛樺叆鏁版嵁搴? {
sprintf(sql, "insert into id_info (id,password,name) values ('%s', '%s', '%s');", id, password, name1);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.namelist = 1; //绫讳技浜庣櫥褰曟垚鍔燂紝瀛樺叆鍦ㄧ嚎鐢ㄦ埛淇℃伅閾捐〃
strcpy(Sendbuf.name, name1);
strcpy(Sendbuf.id, id);
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
strcpy(id1, id);
printf("\n");
printf("姝e湪娉ㄥ唽......\n");
sleep(1);
printf("\n");
printf("**********\n");
printf("*娉ㄥ唽鎴愬姛*\n");
printf("**********\n");
break;
}
}
}
else if (choose == 3)
{
printf("娆㈣繋涓嬫鍐嶆潵!\n");
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.quit = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("閫€鍑烘垚鍔燂紒\n");
close(sockfd);
sleep(1);
exit(1);
}
else
{
printf("杈撳叆閿欒!\n");
sleep(1);
}
}
return 0;
}
int funinterface(int sockfd) //鍔熻兘瀹炵幇鍑芥暟锛屼紶鍏ヤ簬鏈嶅姟鍣ㄨ繛鎺ュソ鐨剆ockfd
{
int choose, ret;
sqlite3* pdb;
char sql[100] = {0};
char name[100] = {0};
char look[100] = {0};
char str[100] = {0};
char use[100] = {0};
char record[100] = {0};
struct info Sendbuf;
Sockfd = sockfd;
signal(SIGINT, quit); //姝ゆ椂鑻ヨ幏鍙朿trl锛媍淇″彿锛屽垯璋冪敤quit鍑芥暟锛岃繘琛屽fd鐨勫叧闂? ret = sqlite3_open("user.db", &pdb);
if (SQLITE_OK != ret)
{
perror("sqlite3_open");
exit(1);
}
memset(sql, 0, sizeof(sql));
sprintf(sql, "create table if not exists '%s' (chatinfo text);", id1); //鍒涘缓涓撳睘鐨勮亰澶╄褰曡〃
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec1");
exit(1);
}
while(1)
{
system("clear");
printf("*************************************************************\n");
printf("* * * Welcome to chatting room! * *\n");
printf("* * 1.鏌ョ湅鎵€鏈夊湪绾垮ソ鍙? * * **\n");
printf("* * * * 2.绉佽亰濂藉弸 * *\n");
printf("* * * 3.缇ゅ彂娑堟伅 * * *\n");
printf("* 4.韪㈠嚭缇よ亰 * * * * *\n");
printf("* * * 5.绂佽█ * * *\n");
printf("* * * * 6.瑙i櫎绂佽█ * * *\n");
printf("* * * 7.鍙戦€佽〃鎯? * * * *\n");
printf("* * * * 8.鍙戦€佸父鐢ㄨ * *\n");
printf("* * 9.娉ㄥ唽浼氬憳 * * *\n");
printf("* * * 10.鏌ョ湅鑱婂ぉ璁板綍 * *\n");
printf("* * * 11.閫€鍑鸿亰澶╁ * * *\n");
printf("* * * 12.浣跨敤鎵嬪唽 * * *\n");
printf("*************************************************************\n");
printf("浣犵殑缃戝悕:%s \n璇疯緭鍏ユ偍閫夋嫨鐨勫姛鑳?\n", name1);
printf("\n");
printf("***********************************************/ 娑堟伅鏍? /\n");
ret = scanf("%d", &choose);
if (ret == 0)
{
int ch;
printf("杈撳叆閿欒!\n");
while ((ch = getchar()) != EOF && ch != '\n');
sleep(1);
continue;
}
switch(choose)
{
case(1):
memset(&Sendbuf, 0, sizeof(Sendbuf));
if (speak_flag == 1)
{
Sendbuf.speak = 1;
}
Sendbuf.look_online = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0); //鍙戦€佺粰鏈嶅姟鍣紝杩涜鏌ョ湅鍦ㄧ嚎鐢ㄦ埛
if (-1 == ret)
{
perror("send");
exit(1);
}
sleep(2);
break;
case(2):
if (speak_flag) //鑻ユ帴鏀剁殑绂佽█鏍囧織浣嶅凡缃?锛屽垯宸茶绂佽█
{
printf("\n瀵逛笉璧凤紝鎮ㄥ凡琚瑷€!\n");
sleep(2);
break;
}
else
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
printf("璇疯緭鍏ュソ鍙嬬綉鍚?");
scanf("%s", name);
printf("\n璇疯緭鍏ュ唴瀹?鎸塃nter閿彂閫? 缁撴潫鑱婂ぉ璇疯緭鍏?exit):\n");
printf("\n");
printf("* 鍙€氳繃蹇嵎鏂瑰紡鍙戦€佽〃鎯呭摝 *\n");
printf("**********************************************\n");
printf("* 蹇嵎鏂瑰紡 :) 寮€蹇? ( *^0^* ) *\n");
printf("* 蹇嵎鏂瑰紡 :( 鐢熸皵 ( > o < ) *\n");
printf("* 蹇嵎鏂瑰紡 :< 浼ゅ績 (T _ T ) *\n");
printf("* 蹇嵎鏂瑰紡 :> 鎯婅 (0 A 0|||) *\n");
printf("* 蹇嵎鏂瑰紡 :, 浜蹭翰 (o^3^o) *\n");
printf("**********************************************\n");
while(1)
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
scanf("%s", Sendbuf.buf);
if (!strcmp(Sendbuf.buf, "exit"))
{
break;
}
else if (!strcmp(Sendbuf.buf, ":)"))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "鍚戜綘寰瑧浜嗕竴涓?( *^0^* )");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
}
else if (!strcmp(Sendbuf.buf, ":("))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "鎴戝緢鐢熸皵 ( > o < )");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
}
else if (!strcmp(Sendbuf.buf, ":<"))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "鎴戝緢浼ゅ績 ( > o < )");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
}
else if (!strcmp(Sendbuf.buf, ":>"))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "浠€涔堥 (0 A 0|||)");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
}
else if (!strcmp(Sendbuf.buf, ":,"))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "鍋峰伔浜蹭簡浣犱竴涓?(o^3^o)");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
}
else
{
memset(record, 0, sizeof(record)); //灏嗗彂閫佽€咃紝鍙戦€佸璞★紝鍙戦€佺殑鍐呭鐩告帴鍚? strcpy(record, name1); //瀛樺叆鏁版嵁搴? strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
strcpy(Sendbuf.name, name);
Sendbuf.chat_personal = 1; //灏嗙鑱婃爣蹇椾綅缃竴
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
}
}
}
break;
case(3):
if (speak_flag)
{
printf("\n瀵逛笉璧凤紝鎮ㄥ凡琚瑷€!\n");
sleep(2);
break;
}
else
{
printf("\n娉ㄦ剰锛?閫€鍑鸿杈撳叆:exit\n");
memset(&Sendbuf, 0, sizeof(Sendbuf));
printf("璇疯緭鍏ュ唴瀹?");
scanf("%s", Sendbuf.buf);
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚戝ぇ瀹?);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
Sendbuf.chat_all = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
if (!strcmp(Sendbuf.buf, "exit"))
{
break;
}
}
break;
case(4):
if (vip_flag == 0)
{
printf("\n瀵逛笉璧凤紝鎮ㄦ病鏈夋潈闄怽n"); //鑻ユ病鏈夋敞鍐屼細鍛橈紝鍒欐棤鏉冮檺
sleep(2);
}
else
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
printf("\n璇疯緭鍏ヤ綘鎯宠涪鍑鸿亰澶╁瀵硅薄鐨勭綉鍚?");
sleep(1);
scanf("%s", Sendbuf.name);
Sendbuf.kickout = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
sleep(1);
}
break;
case(5):
if (vip_flag == 0)
{
printf("\n瀵逛笉璧凤紝鎮ㄦ病鏈夋潈闄怽n");
sleep(2);
}
else
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
printf("\n璇疯緭鍏ヤ綘鎯崇瑷€瀵硅薄鐨勭綉鍚?");
sleep(1);
scanf("%s", Sendbuf.name);
Sendbuf.shutup = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
sleep(1);
}
break;
case(6):
if (vip_flag == 0)
{
printf("\n瀵逛笉璧凤紝鎮ㄦ病鏈夋潈闄怽n");
sleep(2);
}
else
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
printf("\n璇疯緭鍏ヤ綘鎯宠В闄ょ瑷€瀵硅薄鐨勭綉鍚?");
sleep(1);
scanf("%s", Sendbuf.name);
Sendbuf.speakout = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
sleep(1);
}
break;
case(7):
system("clear");
printf("\n璇疯緭鍏ユ偍瑕佸彂閫佺殑瀵硅薄:");
scanf("%s", name);
printf("\n");
printf("**********************************************\n");
printf("* 蹇嵎鏂瑰紡 :) 寮€蹇? ( *^0^* ) *\n");
printf("* 蹇嵎鏂瑰紡 :( 鐢熸皵 ( > o < ) *\n");
printf("* 蹇嵎鏂瑰紡 :< 浼ゅ績 (T _ T ) *\n");
printf("* 蹇嵎鏂瑰紡 :> 鎯婅 (0 A 0|||) *\n");
printf("* 蹇嵎鏂瑰紡 :, 浜蹭翰 (o^3^o) *\n");
printf("**********************************************\n");
printf("璇疯緭鍏ヨ〃鎯呭揩鎹锋柟寮?\n");
memset(look, 0, sizeof(look));
scanf("%s", look);
if (!strcmp(look, ":)"))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "鍚戜綘寰瑧浜嗕竴涓?( *^0^* )");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("宸插彂閫?..\n");
sleep(2);
break;
}
else if (!strcmp(look, ":("))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "鎴戝緢鐢熸皵 ( > o < )");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("宸插彂閫?..\n");
sleep(2);
break;
}
else if (!strcmp(look, ":<"))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "鎴戝緢浼ゅ績 ( > o < )");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("宸插彂閫?..\n");
sleep(2);
break;
}
else if (!strcmp(look, ":>"))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "浠€涔堥 (0 A 0|||)");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("宸插彂閫?..\n");
sleep(2);
break;
}
else if (!strcmp(look, ":,"))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "鍋峰伔浜蹭簡浣犱竴涓?(o^3^o)");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("宸插彂閫?..\n");
sleep(2);
break;
}
else
{
printf("杈撳叆閿欒锛乗n");
sleep(1);
break;
}
case(8):
system("clear");
printf("\n\n");
printf("***********************************\n");
printf("* 杈撳叆鏍煎紡 渚嬪: john /welcome *\n");
printf("* *\n");
printf("* 娆㈣繋 /welcome *\n");
printf("* 鐐硅禐 /praise *\n");
printf("* 鍐嶈 /goodbye *\n");
printf("***********************************\n");
printf("\n璇疯緭鍏?");
memset(name, 0 ,sizeof(name));
memset(str, 0, sizeof(str));
scanf("%s %s", name, str);
if (!strcmp(str, "/welcome"))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "娆㈣繋浣犳潵鍒拌亰澶╁");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("宸插彂閫?..\n");
sleep(2);
break;
}
else if (!strcmp(str, "/praise"))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "缁欎綘鐐逛釜璧烇紝浣犵湡妫?);
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("宸插彂閫?..\n");
sleep(2);
break;
}
else if (!strcmp(str, "/goodbye"))
{
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.chat_personal = 1;
strcpy(Sendbuf.name, name);
strcpy(Sendbuf.buf, "鏈嬪弸鏈夌紭鍗冮噷鏉ョ浉浼?");
memset(record, 0, sizeof(record));
strcpy(record, name1);
strcat(record, "鍚?);
strcat(record, name);
strcat(record, "鍙戦€佷簡:");
strcat(record, Sendbuf.buf);
memset(sql, 0, sizeof(sql));
sprintf(sql, "insert into '%s' (chatinfo) values ('%s');",id1, record);
ret = sqlite3_exec(pdb, sql, NULL, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("宸插彂閫?..\n");
sleep(2);
break;
}
else
{
printf("杈撳叆閿欒锛乗n");
sleep(1);
break;
}
case(9):
printf("鎭枩鎮ㄥ凡娉ㄥ唽涓虹櫧閲戜細鍛?\n");
vip_flag = 1; //灏嗕細鍛樻爣蹇椾綅缃竴
sleep(2);
break;
case(10):
memset(sql, 0, sizeof(sql));
sprintf(sql, "select * from '%s';", id1); //鎵撳嵃鐢ㄦ埛鏁版嵁搴撲腑鎵€鏈夎亰澶╄褰? ret = sqlite3_exec(pdb, sql, print, NULL, NULL);
if (SQLITE_OK != ret)
{
perror("sqlite3_exec2");
exit(1);
}
printf("杈撳叆浠绘剰閿€€鍑篭n");
scanf("%s", look);
break;
case(11):
printf("娆㈣繋涓嬫鍐嶆潵!\n"); //閫€鍑洪€夐」
memset(&Sendbuf, 0, sizeof(Sendbuf));
Sendbuf.esc = 1;
ret = send(sockfd, &Sendbuf, sizeof(Sendbuf), 0);
if (-1 == ret)
{
perror("send");
exit(1);
}
printf("閫€鍑烘垚鍔燂紒\n");
sleep(2);
break;
case(12):
printf(" 杈撳叆浠绘剰閿€€鍑篭n");
printf("\n1.杈撳叆鏁板瓧閫夋嫨鍔熻兘\n");
printf("2.绉佽亰濂藉弸鏃跺彧鏈夎緭鍏xit鎵嶅彲浠ラ€€鍑篭n");
printf("3.甯愬彿涓嶅彲閲嶅鐧诲綍锛岀綉鍚嶄笉鍙噸澶峔n");
scanf("%s", use);
break;
default:
printf("杈撳叆閿欒锛乗n");
sleep(1);
break;
}
}
return 0;
}
运行时将两个server文件编译成一个可执行文件,两个client文件也编译成一个可持续文件,先运行服务器,再运行客户端