久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

方案二、三SELECT、UDP完成聊天室

發布時間:2025/3/19 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 方案二、三SELECT、UDP完成聊天室 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Select 多路復用

服務器類型中

循環服務器:同一時刻只可以響應一個客戶端的請求

并發服務器:同一時刻 可以響應 多個 客戶端的請求

?

實現:

服務器:

1.創建socket

2.綁定 bind 記得創建server_address :( struct sockaddr_in server_addr)

3.設置監聽隊列 listen//(TCP這里和accept配合使用

一個while循環listen和accept(阻塞)搭配完成一次新socket創建)

//SELECT中 listen在while循環外面

/****** ???????????????????上面同第一篇TCP實現原理相同 ???????????????*******/

?

4.Select 用以監聽fd(文件描述符 所有的~~)

(函數原型)

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

Nfds:(maxfd)代表目前已打開的 文件fd 數目 + 1

Readfds ?writefds ?exceptfds :

都是集合(是所有fd 的集合)

用以監聽 fd 是否 可讀 / 可寫 / 有異常發生

作為服務器 我們只需要監聽 是否可讀 :客戶端發起請求,服務器可以讀到客戶 的信息

Timeout:?是結構體 結構體內有兩個值 一個秒 一個微秒

Timeout取值:

0 :不管有無 fd 可讀 都直接返回

NULL: 阻塞狀態 不斷掃描所有的 fd 直到有 fd 發生變化 才返回

正整數:等待的最長時間t;t秒內如果沒有 fd 可讀 程序繼續向下執行

?

?

fd_set ReadFd,TmpFd;//(是一個fd集合)用于select 參數

FD_ZERO(&ReadFd);//將兩個參數初始化

FD_ZERO(&TmpFd);

FD_SET(sockfd,&ReadFd);//先將sockfd加入集合:監聽是否有人發起連接

客戶端不變

其余信息看代碼解釋

?

?

UDP:

UDP是最簡單的

服務器:

  • 創建socket
  • 綁定 bind
  • 接受信息 recvfrom
  • 指定發送的對象 sendto
  • 客戶端:

  • 創建Socket
  • Sendto 發送信息
  • Recvfrom 接受信息
  • ?

    ?服務器:

    Socket 和 bind同TCP

    ?

    3 . ?recvfrom()

    (函數原型)ssize_t recvfrom(int s, void *buf, size_t len, int flags,

    ???????????????????????? struct sockaddr *from, socklen_t *fromlen);

    S?: ? ? ? ? ? ? ?就是自己創建的sockfd

    Buf: ? ? ? ? ? ?自己想要發送的內容

    Len : ? ? ? ? ??buf的大小

    Flags: ? ? ? ? 默認為0

    From: ? ? ? 就是自己本身啊 從自己發消息出去(看到這個前綴就知道 又要創建一個自己的 地址 別忘了 struct sockaddr ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? *client_addr)

    Fromlen: ? ? 是地址的長度 因為是指針所以回頭 自己定義的length 記得取地址 &

    ?

    ?

    客戶端一樣如此

    ?

    4.sendto()

    (函數原型)ssize_t ?sendto(int ?s, ?const ?void *buf, size_t len, int flags, const

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?struct sockaddr *to, socklen_t tolen);

    S: ? ? ? ? ? 創建的sockfd

    Buf: ? ? ? ?接受發來的消息

    Len : ???? ?buf的大小

    Flags: ????默認為0

    To: ? ? ??發送給誰(服務器啊) (看到這個前綴就知道 又要創建一個地址 別忘了 struct sockaddr *server_addr)

    Tolen: ? ? 是地址的長度 ?這里不是指針所以不用取地址

    ?

    ?

    附上源碼:感覺可以的點個贊再走

    TCP:

    client.c

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<sqlite3.h>struct user {char name[10]; //用戶昵稱char ID[20]; //帳號char password[20]; //密碼int type; //消息種類int state; //1表示在線,0表示離線char toname[10]; //私聊信息發送對象char record[100]; //聊天記錄int level; //用戶權限:2表示管理員,1為普通用戶,0表示被禁言,-1表示被踢出 struct user *next; };char NAME[20]={0}; //用于檢測有無此用戶名 char NAME2[20]={0}; //用于存放登錄用戶的用戶名 char id[20]={0}; char PASSWORD[20]={0}; int SIGN=0; int SIGN2=10; int SIGN3=0; int count=0; //記錄會員的數量(只能有一個)int Tname(void *para,int columnCount,char **columnValue,char **columnName) {if(strcmp(columnValue[0],NAME) == 0){SIGN=1;}return 0; }int Tid(void *para,int columnCount,char **columnValue,char **columnName) {if(strcmp(columnValue[0],id) == 0){SIGN=1;}return 0; }void zhuce(int sockfd) //注冊 {sqlite3 *pdb;char sql[100]={0};struct user User;int ret;ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite_open");return;}printf("****************************************\n");printf(" 請輸入您想要的昵稱:\n");fflush(stdout);while(1){scanf("%s",User.name);memset(NAME,0,sizeof(NAME));strcpy(NAME,User.name);sprintf(sql,"select name from user1 where name='%s';",User.name);ret=sqlite3_exec(pdb,sql,Tname,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(SIGN == 0)//昵稱未被注冊{break;}else{SIGN=0;printf(" 該已用戶昵稱被注冊!\n");printf(" 請重新輸入用戶昵稱:\n");fflush(stdout);}}SIGN=0;//復位printf("\n");printf(" 清輸入您的帳號:\n");fflush(stdout);while(1){scanf("%s",User.ID);memset(id,0,sizeof(id));strcpy(id,User.ID);sprintf(sql,"select ID from user1 where ID='%s';",User.ID);ret=sqlite3_exec(pdb,sql,Tid,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(SIGN == 0)//帳號未被注冊{break;}else{SIGN=0;printf(" 該帳號已被注冊!\n");printf(" 請重新輸入帳號:\n");fflush(stdout);}}SIGN=0;//復位ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}printf("\n");printf(" 請輸入您的密碼:\n");fflush(stdout);scanf("%s",User.password);while(strlen(User.password) <= 5){printf(" 密碼長度過短,請重新輸入:\n");fflush(stdout);scanf("%s",User.password);}printf("\n");printf(" 恭喜您用戶注冊成功!\n");printf("****************************************\n");sleep(2);User.type=1;//設置消息類型為注冊(1)User.state=0;//表示不在線User.level=1;//表示為普通用戶ret=send(sockfd,&User,sizeof(User),0);//打包發送給服務器if(ret == -1){perror("send");return;}}int Tid2(void *para,int columnCount,char **columnValue,char **columnName) {memset(NAME2,0,sizeof(NAME2));strcpy(NAME2,columnValue[0]);if(strcmp(columnValue[1],id) == 0){SIGN=1; }if(strcmp(columnValue[3],"1") == 0){SIGN=2;}return 0; }int Tpassword(void *para,int columnCount,char **columnValue,char **columnName) {if(strcmp(columnValue[0],PASSWORD) == 0){SIGN=1;}return 0; }void login(int sockfd)//登錄 {int ret;sqlite3 *pdb;char sql[100]={0};struct user User;ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite_open");return;}printf("********************************\n");printf(" 清輸入您的帳號:\n");fflush(stdout);while(1){scanf("%s",User.ID);memset(id,0,sizeof(id));strcpy(id,User.ID);sprintf(sql,"select * from user1 where ID='%s';",User.ID);ret=sqlite3_exec(pdb,sql,Tid2,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(SIGN == 1){break;}else if(SIGN == 2){SIGN=0;printf(" 該帳號已在別處登錄!\n");printf(" 請重新輸入:\n");fflush(stdout);}else{SIGN=0;printf(" 該帳號不存在,請重新輸入:\n");fflush(stdout);} }SIGN=0;printf(" 清輸入您的密碼:\n");fflush(stdout);while(1){scanf("%s",User.password);memset(PASSWORD,0,sizeof(PASSWORD));strcpy(PASSWORD,User.password);sprintf(sql,"select password from user1 where ID='%s';",User.ID);ret=sqlite3_exec(pdb,sql,Tpassword,NULL,NULL);//取出user表中的帳號信息if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(SIGN == 1){break;}else{SIGN=0;printf(" 密碼錯誤,請重新輸入:\n");fflush(stdout);}}SIGN=0;printf(" 登錄成功!\n");printf("********************************\n");sleep(2);ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}strcpy(User.name,NAME2);User.type=2;//設置消息類型為登錄(2)User.state=1;//設置用戶在線ret=send(sockfd,&User,sizeof(User),0);//打包發送給服務器if(ret == -1){perror("send");return;}}int print(void *para,int columnCount,char **columnValue,char **columnName) {printf("%s:%s\n",columnName[0],columnValue[0]);return 0; }void listonline() //查看當前在線用戶 {sleep(1);system("clear");int ret;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite_open");return;}printf("?????????????????????????????????\n");printf(" 當前在線用戶為:\n");sprintf(sql,"select name from user1 where state=1;");ret=sqlite3_exec(pdb,sql,print,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}printf("?????????????????????????????????\n");ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}sleep(2);}int Tlevel(void *para,int columnCount,char **columnValue,char **columnName) //檢測用戶是否被禁言 {if(strcmp(columnValue[0],"1") == 0 || strcmp(columnValue[0],"2") == 0){SIGN2=5;}if(strcmp(columnValue[0],"0") == 0){SIGN2=0;}return 0; }int Tprivatechat(void *para,int columnCount,char **columnValue,char **columnName) //檢測用戶是否存在 {if(strcmp(columnValue[0],NAME) == 0){SIGN=1;}if(strcmp(columnValue[0],NAME2) == 0){SIGN=2;}return 0; }//檢測該用戶是否在線 int Tonline(void *para,int columnCount,char **columnValue,char **columnName) {if(strcmp(columnValue[0],"1") == 0){SIGN3=1;}return 0; }void chatprivate(int sockfd) //私聊 {sleep(1);system("clear");printf("?????????????????????????????????\n");int ret;sqlite3 *pdb;char sql[100]={0};struct user User;ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite_open");return;}sprintf(sql,"select level from user1 where name='%s';",NAME2);ret=sqlite3_exec(pdb,sql,Tlevel,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(SIGN2 == 0){printf(" 您已被管理員禁言!\n");sleep(1);SIGN2=10;return;}printf(" 請選擇您想私聊的用戶:\n");fflush(stdout);while(1){SIGN=0;SIGN3=0;memset(NAME,0,sizeof(NAME));scanf("%s",NAME);sprintf(sql,"select name from user1 where name='%s';",NAME);ret=sqlite3_exec(pdb,sql,Tprivatechat,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}sprintf(sql,"select state from user1 where name='%s';",NAME);ret=sqlite3_exec(pdb,sql,Tonline,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}//表示存在該用戶且該用戶在線if(SIGN == 1 && SIGN3 ==1){break;}if(SIGN == 2){printf(" 不能和自己聊天!\n");printf(" 請重新輸入您想私聊的用戶:");fflush(stdout);}if(SIGN3 == 0 && SIGN == 1){ printf(" 該用戶不在線!\n");printf(" 請重新輸入您想私聊的用戶:");fflush(stdout);}if(SIGN == 0){printf(" 該用戶不存在!\n");printf(" 請重新輸入您想私聊的用戶:");fflush(stdout);} }ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}SIGN=0;//復位SIGN3=0;printf("?????????????????????????????????\n");printf("******聊天室******\n");printf(" 常用表情\n");printf("smile ( ^_^ ) cry T_T \n ");printf("sweat -_-! angry >_< \n ");printf("dizzy +_+ suprise (⊙?⊙)\n");while(1){User.type=3;//設置消息類型為私聊(3),最后哦發送給服務器;strcpy(User.name,NAME2);strcpy(User.toname,NAME);scanf("%s",User.record);if(strcmp(User.record,"end") == 0){printf(" 再見!\n");printf("******聊天室******\n");sleep(1);SIGN2=10;break;}ret=send(sockfd,&User,sizeof(User),0);if(ret == -1){perror("send");return;}memset(&User,0,sizeof(User));}}void chatall(int sockfd) //群聊 {sleep(1);system("clear");int ret;struct user User;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite_open");return;}sprintf(sql,"select level from user1 where name='%s';",NAME2);ret=sqlite3_exec(pdb,sql,Tlevel,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}if(SIGN2 == 0){printf(" 您已被管理員禁言!\n");sleep(1);SIGN2=10;return;}printf("?????????????Chatting room????????????????\n");while(1){User.type=4;//設置消息類型為私聊(4),最后發送給發服務器;scanf("%s",User.record);if(strcmp(User.record,"end") == 0){printf(" 通話結束!\n");sleep(1);SIGN2=10;break;}strcpy(User.name,NAME2);ret=send(sockfd,&User,sizeof(User),0);if(ret == -1){perror("send");return;}memset(&User,0,sizeof(User));} }int Tprivate(void *para,int columnCount,char **columnValue,char **columnName) {if(strcmp(columnValue[0],NAME) == 0){SIGN=1;}if(strcmp(columnValue[0],NAME2) == 0){SIGN=2;}return 0; }int printprivate(void *para,int columnCount,char **columnValue,char **columnName) //打印私聊 {printf("%s:%s\n",columnValue[0],columnValue[2]);return 0; }void findprivate() {sleep(1);system("clear");int key=1;int ret;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite_open");return;}printf(" 您想查詢與誰的聊天記錄:");fflush(stdout);while(1){SIGN=0;memset(NAME,0,sizeof(NAME));scanf("%s",NAME);sprintf(sql,"select name from user1 where name='%s';",NAME);ret=sqlite3_exec(pdb,sql,Tprivate,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}//判斷用戶是否存在且不是自己if(SIGN == 1){break;}else if(SIGN == 2){printf(" 您無法查詢與自己的聊天記錄!\n");printf(" 請重新輸入您想查詢的用戶:");fflush(stdout);}else{printf(" 該用戶不存在!\n");printf(" 請重新輸入您想查詢的用戶:");fflush(stdout);} }SIGN=0;//復位sprintf(sql,"select * from Privatechatrecord where name='%s' AND toname='%s' OR name='%s' AND toname='%s';",NAME,NAME2,NAME2,NAME);ret=sqlite3_exec(pdb,sql,printprivate,NULL,NULL); if(ret != SQLITE_OK){perror("sqlite_exec");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}}int printall(void *para,int columnCount,char **columnValue,char **columnName) //打印群聊 {printf("%s:%s\n",columnValue[0],columnValue[1]);return 0; }void findall() {sleep(1);system("clear");int key=1;int ret;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite_open");return;}sprintf(sql,"select * from Groupchatrecord;");ret=sqlite3_exec(pdb,sql,printall,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}}int TVIP(void *para,int columnCount,char **columnValue,char **columnName) //統計會員數,一開始作判斷,管理數目只有一個; {if(strcmp(columnValue[0],"2") == 0){count++;}return 0; }void VIP(int sockfd)//vip {sleep(1);system("clear");char key[2]={0};int ret;struct user User;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite_open");return;}sprintf(sql,"select level from user1;");ret=sqlite3_exec(pdb,sql,TVIP,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}if(count >= 1){printf(" 會員名額為0,請下次再來!\n");count=0;sleep(1);return;}printf(" 確定要支付998成為會員嗎?(y/n)\n");scanf("%s",key);if(key[0] == 'y'){User.type=5;User.level=2;strcpy(User.name,NAME2);ret=send(sockfd,&User,sizeof(User),0);if(ret == -1){perror("send");return;}printf(" 恭喜您成為會員,享受踢人禁言功能!\n");}if(key[1] == 'n'){printf(" sorry,開通失敗!\n");}sleep(1); }int ifvip(void *para,int columnCount,char **columnValue,char **columnName) //檢驗用戶是否為vip {if(strcmp(columnValue[0],"2") == 0){SIGN=1;}return 0; }int Tcunzai(void *para,int columnCount,char **columnValue,char **columnName) //檢驗用戶是否存在 {if(strcmp(columnValue[0],NAME) == 0){SIGN=1;}return 0; }void shutup(int sockfd) {sleep(1);system("clear");int ret;sqlite3 *pdb;char sql[100]={0};struct user User;ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite_open");return;}sprintf(sql,"select level from user1 where name='%s';",NAME2);ret=sqlite3_exec(pdb,sql,ifvip,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(SIGN == 0){printf(" 對不起,您的權限不足!\n"); sleep(1);return;}else{printf(" 請選擇您想禁言的用戶:");fflush(stdout);while(1){SIGN=0;SIGN3=0;scanf("%s",User.name);memset(NAME,0,sizeof(NAME));strcpy(NAME,User.name);sprintf(sql,"select name from user1 where name='%s';",User.name);ret=sqlite3_exec(pdb,sql,Tcunzai,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}sprintf(sql,"select state from user1 where name='%s';",User.name);ret=sqlite3_exec(pdb,sql,Tonline,NULL,NULL);//判斷用戶是否存在且是否在線if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(SIGN == 1 && SIGN3 == 1){break;}else if(SIGN == 1 && SIGN3 == 0){printf(" 此用戶不在線!\n");printf(" 請重新輸入:");fflush(stdout);}else{printf(" 此用戶不存在!\n");printf(" 請重新輸入:");fflush(stdout);}}SIGN=0;User.type=6;ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}ret=send(sockfd,&User,sizeof(User),0);if(ret == -1){perror("send");return;}printf(" %s用戶已被禁言!\n",User.name);sleep(1);}}void jiejin(int sockfd) {sleep(1);system("clear");int ret;sqlite3 *pdb;char sql[100]={0};struct user User;ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite_open");return;}sprintf(sql,"select level from user1 where name='%s';",NAME2);ret=sqlite3_exec(pdb,sql,ifvip,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(SIGN == 0){printf(" 對不起,您的權限不足!\n"); sleep(1);return;}else{printf(" 請選擇您想解禁的用戶:");fflush(stdout);while(1){SIGN=0;SIGN3=0;scanf("%s",User.name);memset(NAME,0,sizeof(NAME));strcpy(NAME,User.name);sprintf(sql,"select name from user1 where name='%s';",User.name);ret=sqlite3_exec(pdb,sql,Tcunzai,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}sprintf(sql,"select state from user1 where name='%s';",User.name);ret=sqlite3_exec(pdb,sql,Tonline,NULL,NULL);//判斷用戶是否存在且是否在線if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(SIGN == 1 && SIGN3 == 1){break;}else if(SIGN == 1 && SIGN3 == 0){printf(" 此用戶不在線!\n");printf(" 請重新輸入:");fflush(stdout);}else{printf(" 此用戶不存在!\n");printf(" 請重新輸入:");fflush(stdout);}}SIGN=0;User.type=9;ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}ret=send(sockfd,&User,sizeof(User),0);if(ret == -1){perror("send");return;}printf(" %s用戶已解除禁言!\n",User.name);sleep(1);}}void Kickout(int sockfd) {sleep(1);system("clear");int ret;sqlite3 *pdb;char sql[100]={0};struct user User;ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite_open");return;}sprintf(sql,"select level from user1 where name='%s';",NAME2);ret=sqlite3_exec(pdb,sql,ifvip,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(SIGN == 0){printf(" 對不起,您的權限不足!\n"); sleep(1);return;}else{printf(" 請選擇您想踢出的用戶:");fflush(stdout);while(1){SIGN=0;SIGN3=0;scanf("%s",User.name);memset(NAME,0,sizeof(NAME));strcpy(NAME,User.name);sprintf(sql,"select name from user1 where name='%s';",User.name);ret=sqlite3_exec(pdb,sql,Tcunzai,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}sprintf(sql,"select state from user1 where name='%s';",User.name);ret=sqlite3_exec(pdb,sql,Tonline,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(SIGN == 1 && SIGN3 == 1){break;}else if(SIGN == 1 && SIGN3 == 0){printf(" 此用戶不在線!\n");printf(" 請重新輸入:");fflush(stdout);}else {printf(" 此用戶不存在!\n");printf(" 請重新輸入:");fflush(stdout);}}SIGN=0;User.type=7;ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}ret=send(sockfd,&User,sizeof(User),0);if(ret == -1){perror("send");return;}printf(" %s用戶已被您踢出!\n",User.name);sleep(1);}}void Quit(int sockfd) //退出 {sleep(1);system("clear");int ret;struct user User;User.state=0; User.type=8;strcpy(User.name,NAME2);ret=send(sockfd,&User,sizeof(User),0);if(ret == -1){perror("send");return;}printf("???????????????????????????????????????\n");printf("???? ? goodbye!~ ? ???? \n");printf("???????????????????????????????????????\n");sleep(1);}void TERMIN() {sleep(1);system("clear");printf("???????????????????????????????????????\n");printf("???? 您選擇了退出聊天室~ ????\n");printf("???????????????????????????????????????\n");sleep(1); }

    client-main.c

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<strings.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<pthread.h>#define PORT 1234struct user {char name[10];char ID[20];char password[20];int type;int state;char toname[10];char record[100];int fd;int level;struct user *next; };pthread_t tid[2]; int out=1; //標志位:表示是否退出客戶端void* denglu(void *arg) {int ret;char key1[10]={0}; //登錄界面功能選擇按鍵char key2[10]={0}; //登錄后功能選擇按鍵system("clear");printf("??????????????????????????????????\n");printf("????? ? 聊天室 ? ?????\n");printf("??????????????????????????????????\n");sleep(2);while(1){system("clear");printf("??????????????????????????????????????????\n");printf("????? 1.注冊 ????? \n");printf("????? 2.登錄 ????? \n");printf("????? 3.退出 ????? \n");printf("??????????????????????????????????????????\n");printf("????? 請選擇您的功能 ?????\n");printf("??????????????????????????????????????????\n");scanf("%s",key1);switch(key1[0]){case '1':system("clear");zhuce(*(int*)arg);//注冊界面break;case '2':system("clear");login(*(int*)arg);//登錄界面 getin: system("clear");printf("??????????????????????????????????????????\n");printf("????? 1.在線用戶 ????? \n");printf("????? 2.私聊 ????? \n");printf("????? 3.群聊 ?????\n");printf("????? 4.查詢私聊記錄 ????? \n");printf("????? 5.查詢群聊記錄 ?????\n");printf("????? 6.開通會員 ?????\n");printf("????? 7.禁言 ?????\n");printf("????? 8.踢人 ????? \n");printf("????? 9.退出 ????? \n");printf("????? 0.解禁 ????? \n");printf("??????????????????????????????????????????\n");printf("? 請選擇您的功能 ?\n");printf("??????????????????????????????????????????\n");scanf("%s",key2);switch(key2[0]){case '1':listonline();//查看在線用戶sleep(2);goto getin;case '2':chatprivate(*(int*)arg);//私聊sleep(2);goto getin;case '3':chatall(*(int*)arg);//群發sleep(2);goto getin;case '4':findprivate();//查詢私聊記錄sleep(2);goto getin;case '5':findall();//查詢群聊記錄sleep(2);goto getin;case '6':VIP(*(int*)arg);//開通會員sleep(2);goto getin;case '7':shutup(*(int*)arg);//禁言sleep(2);goto getin;case '8':Kickout(*(int*)arg); //踢人sleep(2);goto getin;case '9':Quit(*(int*)arg); //退出界面sleep(2);break;case '0':jiejin(*(int*)arg);//解除禁言sleep(2);goto getin;default:printf("??????????????????????????????????????????\n");printf("????? 錯誤按鈕(登錄后)! ?????\n");printf("??????????????????????????????????????????\n");sleep(2);goto getin; }break;case '3':goto breakout;default:printf("??????????????????????????????????????????\n");printf("????? 錯誤按鈕(登錄前)! ?????\n");printf("??????????????????????????????????????????\n");printf("錯誤按鈕(登錄前)!\n");break;}}breakout:TERMIN();//退出客戶端out=0;//復位pthread_cancel(tid[0]);//退出客戶端后,將接受信息的進程殺死,不然一直阻塞在那里}void* Receive(void *arg) {int ret;struct user User;while(1){memset(&User,0,sizeof(User));ret=recv(*(int*)arg,&User,sizeof(User),0);if(ret == -1){perror("recv");exit(1);}if(User.type == 3)//私聊{printf("%s:%s\n",User.name,User.record);}if(User.type == 4)//群發{printf("%s:%s\n",User.name,User.record);}if(User.type == 7)//踢人{break;}} }int main() {int sockfd;int ret;char key1[10]={0};//登錄選擇char key2[10]={0};//登錄后選擇struct sockaddr_in server_addr;sockfd=socket(PF_INET,SOCK_STREAM,0);if(sockfd == -1){perror("socket");exit(1);}bzero(&server_addr,sizeof(server_addr));server_addr.sin_family=PF_INET;server_addr.sin_port=htons(PORT);server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");ret=connect(sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr));//連接服務器if(ret == -1){perror("connect");exit(1);}while(1){ret=pthread_create(&tid[0],NULL,Receive,(void*)&sockfd);if(ret != 0){perror("pthread_create");exit(1);}ret=pthread_create(&tid[1],NULL,denglu,(void*)&sockfd);if(ret != 0){perror("pthread_create");exit(1);}pthread_join(tid[0],NULL);if(out == 0){break;}pthread_cancel(tid[1]);//先退出登錄后的界面,回到注冊登錄退出界面,完成被踢就退出的功能printf("??????????????????????????????????????????\n");printf("????? 您被管理員踢出了聊天室! ?????\n");printf("??????????????????????????????????????????\n");sleep(3);}return 0; }

    server.c

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<strings.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<sys/select.h> #include<sys/time.h> #include<unistd.h> #include<sqlite3.h>struct user {char name[10];char ID[20];char password[20];int type;int state;char toname[10];char record[100];int fd;int level;struct user *next; };int tofd=0; //私聊的通信管道號 char NAME[20]={0}; //暫時存儲用戶昵稱 int onlineflag=0; void zhuce(struct user User,int fd) //消息類型1:注冊 {int ret;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite3_open");return; } sprintf(sql, "create table if not exists user1 (name text,ID text,password text,state integer,level integer);");//繼續使用user1表 ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL); if(ret != SQLITE_OK){perror("sqlite_create"); return;}sprintf(sql,"insert into user1 (name,ID,password,state,level) values('%s','%s','%s',%d,%d);",User.name,User.ID,User.password,User.state,User.level);//插入用戶信息ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_insert");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;} }void login(struct user User,int fd) //消息類型12:登錄 {int ret;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite3_open");return;}sprintf(sql,"create table if not exists user2 (name text,fd integer);");//繼續使用user2表 ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_create");return;}sprintf(sql,"insert into user2(name,fd) values('%s',%d);",User.name,fd);//將客戶端的通信管道號插入表中ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_update");return;}sprintf(sql,"update user1 set state=1 where ID='%s';",User.ID);//設置在線ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_update");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;} }void Turn(char a[]) {if(strcmp(a,"smile") == 0){strcpy(a,"( ^_^ )");}if(strcmp(a,"cry") == 0){strcpy(a,"T_T");}if(strcmp(a,"sweat") == 0){strcpy(a,"-_-!");}if(strcmp(a,"angry") == 0){strcpy(a,">_<");}if(strcmp(a,"dizzy") == 0){strcpy(a,"+_+");}if(strcmp(a,"suprise") == 0){strcpy(a,"(⊙?⊙)");} }int assign(void *para,int columnCount,char **columnValue,char **cloumnName) //通過用戶昵稱找到通信管道號 {tofd=atoi(columnValue[0]);return 0; }void chatprivate(struct user User,int fd) //消息類型13:私聊 {int ret;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite3_open");return;}sprintf(sql,"select fd from user2 where name='%s';", User.toname);ret=sqlite3_exec(pdb,sql,assign,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite3_exec");return;}Turn(User.record);//將文字轉換為表情符號ret=send(tofd,&User,sizeof(User),0); if(ret == -1){perror("send");return;}sprintf(sql, "create table if not exists Privatechatrecord (name text,toname text,record text);"); //創建Privatechat表ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL); if(ret != SQLITE_OK){perror("sqlite_create"); return;}sprintf(sql,"insert into Privatechatrecord (name,toname,record) values('%s','%s','%s');",User.name,User.toname,User.record);//存儲私聊ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_insert");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;}tofd=0; }int Tstate(void *para,int columnCount,char **columnValue,char **columnName) //檢測是否在線 {if(strcmp(columnValue[0],"0") != 0){onlineflag=1;}return 0; }void chatall(struct user User,int source_fd,int fd[],int k) //消息類型14:群聊 {int i;int ret;sqlite3 *pdb;char sql[100]={0};Turn(User.record);ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite3_open");return;}sprintf(sql, "create table if not exists Groupchatrecord (name text,record text);");//創建Groupchat表 ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL); if(ret != SQLITE_OK){perror("sqlite_create"); return;}sprintf(sql,"insert into Groupchatrecord (name,record) values('%s','%s');",User.name,User.record);//存儲群聊ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_insert");return;}for(i=0;i<k;i++){if(fd[i] == source_fd)//給除了自己以外的用戶發送消息{continue;}sprintf(sql,"select fd from user2 where fd='%d';",fd[i]);ret=sqlite3_exec(pdb,sql,Tstate,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_exec");return;}if(onlineflag == 1){ret=send(fd[i],&User,sizeof(User),0);if(ret == -1){perror("send");return;}onlineflag=0;}}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;} }void VIP(struct user User) //消息類型15:開通會員 {int ret;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite3_open");return;}sprintf(sql,"update user1 set level=2 where name='%s';",User.name);//更新用戶權限為管理員ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_update");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;} }void shutup(struct user User) //消息類型16:禁言 {int ret;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite3_open");return;}sprintf(sql,"update user1 set level=0 where name='%s';",User.name);//更新用戶權限為被禁言ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_update");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;} }void kickout(struct user User) //消息類型17:踢人 { int ret;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite3_open");return;}sprintf(sql,"update user1 set state=0 where name='%s';",User.name);//更新用戶不在線ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_update");return;}sprintf(sql,"select fd from user2 where name='%s';", User.name);//找到對應通信管道號ret=sqlite3_exec(pdb,sql,assign,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite3_exec");return;}sprintf(sql,"delete from user2 where name='%s';",User.name);//將被踢用戶從表中刪除ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_delete");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;} ret=send(tofd,&User,sizeof(User),0);if(ret == -1){perror("send");return;}tofd=0; }void quit(struct user User) //消息類型18:退出 {int ret;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite3_open");return;}sprintf(sql,"update user1 set state=0 where name='%s';",User.name);//更新用戶不在線ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_update");return;}sprintf(sql,"delete from user2 where name='%s';",User.name);//將用戶從表中刪除ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_delete");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;} } void jiejin(struct user User) //消息類型16:禁言 {int ret;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite3_open");return;}sprintf(sql,"update user1 set level=1 where name='%s';",User.name);//更新用戶權限為解除禁言ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){perror("sqlite_update");return;}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");return;} }

    server_main.c

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<strings.h> #include<sys/types.h> #include<sys/socket.h> #include<arpa/inet.h> #include<sys/select.h> #include<sys/time.h> #include<unistd.h> #include<sqlite3.h>#define PORT 1234struct user {char name[10];char ID[20];char password[20];int type;int state;char toname[10];char record[100];int fd;int level;struct user *next; };int main() {int sockfd;int ret;int fd[100]; int MaxFd;int i=0,j;fd_set ReadFd,TmpFd;struct sockaddr_in server_addr;struct sockaddr_in client_addr;struct user User;sqlite3 *pdb;char sql[100]={0};ret=sqlite3_open("Database.db",&pdb);if(ret != SQLITE_OK){perror("sqlite3_open");exit(1);}sprintf(sql,"create table if not exists user1 (name text,ID text,password text,state integer,level integer);"); //創建user1表 ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL); if(ret != SQLITE_OK){perror("sqlite_create1"); exit(1);}sprintf(sql,"create table if not exists user2 (name text,fd integer);");//創建user2表 ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL); if(ret != SQLITE_OK){perror("sqlite_create1"); exit(1);}sprintf(sql,"create table if not exists Privatechatrecord (name text,toname text,record text);");//創建Private chat record表 ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL); if(ret != SQLITE_OK){perror("sqlite_create2"); exit(1);}sprintf(sql, "create table if not exists Groupchatrecord (name text,record text);");//創建Group chat record表 ret=sqlite3_exec(pdb,sql,NULL,NULL,NULL); if(ret != SQLITE_OK){perror("sqlite_create3"); exit(1);}ret=sqlite3_close(pdb);if(ret != SQLITE_OK){perror("sqlite_close");exit(1);} sockfd=socket(PF_INET,SOCK_STREAM,0);//創建平臺if(sockfd == -1){perror("socket");exit(1);}int opt=1;setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));//允許多開,避免地址覆蓋bzero(&server_addr,sizeof(server_addr));server_addr.sin_family=PF_INET;server_addr.sin_port=htons(PORT);server_addr.sin_addr.s_addr=htonl(INADDR_ANY);ret=bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr));//把自己綁定好if(ret == -1){perror("bind");exit(1);}ret=listen(sockfd,10);//監聽信息if(ret == -1){perror("listen");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);//用select阻塞if(ret == -1){perror("select");exit(1);}if(FD_ISSET(sockfd,&TmpFd))//看看是不是 有客戶(fd)向服務sockfd發起連接{int length=sizeof(client_addr);fd[i]=accept(sockfd,(struct sockaddr*)&client_addr,&length);//如果有 則sockfd接受 保存客戶信息if(fd[i] == -1){perror("accept");exit(1);}FD_SET(fd[i],&ReadFd);//將客戶加入監聽集合MaxFd=fd[i];//更新maxfd i++;//每有一個客戶發起連接 人數加一}else//fd 在發消息{for(j=0;j<i;j++){if(FD_ISSET(fd[j],&TmpFd))//查看是哪個客戶在發消息 引起了fd 的變化{memset(&User,0,sizeof(User));ret=recv(fd[j],&User,sizeof(User),0);if(ret == -1){perror("recv");exit(1);}if(User.type == 1)//消息類型1:注冊{zhuce(User,fd[j]); }if(User.type == 2)//消息類型12:登錄{login(User,fd[j]); }if(User.type == 3)//消息類型13:私聊{chatprivate(User,fd[j]);}if(User.type == 4)//消息類型14:群聊{chatall(User,fd[j],fd,i);}if(User.type == 5)//消息類型15:開通會員{VIP(User); }if(User.type == 6)//消息類型16:禁言{shutup(User);}if(User.type == 7)//消息類型17:踢人{kickout(User);}if(User.type == 8)//消息類型18:退出{quit(User);}if(User.type == 9)//消息類型18:退出{jiejin(User);}}}}}return 0; }

    ?

    UDP參考網上小姐姐的代碼 我做了封裝

    #ifndef _CHAT_H_ #define _CHAT_H_#include <stdio.h> #include <sqlite3.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <strings.h> #include <stdlib.h> #include <netinet/in.h> //包含socketaddr_in #include <arpa/inet.h> #include <unistd.h> #include <signal.h> #include <pthread.h> #include <semaphore.h> #include <termios.h> #include <time.h> #include <sys/stat.h> #include <fcntl.h> #define PORT 9999#define reg 11 //注冊,cmd #define reg_success 12 //注冊成功 #define existing 13 //賬號已存在 #define log_in 14 //登錄,cmd #define log_success 15 //登錄成功 #define logged 16 //賬號已登錄 #define log_error 17 //賬號或密碼錯誤#define private_chat 18 //私聊 #define group_chat 19 //群聊 #define Gchat_failure 20 //群聊失敗 #define online 21 //在線人數 #define Vip 22 //會員 #define shutup 23 //禁言 #define relieve 24 //解除禁言 #define kick 25 //踢人 #define face 26 //群發表情 #define send_useful 27 //發送常用語 #define Exit 28 //退出 #define quit 31 //下線#define Send_success 29 //發送成功 #define Pchat_failure 30 //私聊失敗 #define Send_failure 32 //發送失敗 #define face_failure 33 //發送表情失敗 #define vip_success 34 //開通會員成功 #define shutup_success 35 //禁言成功 #define kick_success 36 //踢人成功 #define shutup_failure 37 //禁言失敗 #define kick_failure 38 //踢人失敗#endif

    client_function.h

    #ifndef _CLIENT_H_ #define _CLIENT_H_struct info {char username[20]; //用戶名 char password[20]; //密碼 int cmd; //提取操作類型 int result; //返回標記int port; //端口號char message[50]; //保存信息char toname[20]; //發送給誰char fromname[20]; //從誰那里接收char online_name[20][20]; //在線人員名單int num;int p_f;char emoj[20]; //表情int p_u;char useful[20];int vip;char question[50];char answer[50];char file_name[50];char file_content[2048]; };//時間函數 自己百度查找 void time_show();void welcome(void);void bye(void);void show();//防止空格影響 void SCAN_N();//登錄之后的聊天界面 int chatshow();//注冊 將注冊信息發送給服務器 進行注冊 這里是確認注冊信息的過程 int Register();//登錄 同上 確認登錄信息 int Login();//處理登陸后的函數 int deal_login();//接收服務器發送的結果的接口函數 void *Recv_Server(void *arg);#endif

    client_main.c

    \

    #include "clientfunction.h" #include "chat.h"struct info RecvBuf; //接收方 的信息保存 struct info SendBuf; //發送方 的信息保存struct sockaddr_in server_addr; //記錄服務器地址 便于信息傳輸char name[20] = { 0 }; int ret; int sockfd; int flag; int out = 0;//時間函數 自己百度查找 void time_show() {time_t rawtime;struct tm *timeinfo;time(&rawtime);timeinfo = localtime(&rawtime);printf("時間: %d 年 %d 月 %d 日 %d 時 %d 分 %d 秒\n\n", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1,timeinfo->tm_mday, timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);}void welcome(void) {system("clear");printf("\t\t\t*********************************************\n");printf("\t\t\t* *\n");printf("\t\t\t* *\n");printf("\t\t\t* *\n");printf("\t\t\t* Welcome To UDP Chatting Room ! *\n");printf("\t\t\t* *\n");printf("\t\t\t* *\n");printf("\t\t\t* *\n");printf("\t\t\t* *\n");printf("\t\t\t*********************************************\n");sleep(2); }void bye(void) {system("clear");printf("\t\t\t*********************************************\n");printf("\t\t\t\t* *\n");printf("\t\t\t* *\n");printf("\t\t\t* *\n");printf("\t\t\t* Hope To See You Again ! *\n");printf("\t\t\t* *\n");printf("\t\t\t* *\n");printf("\t\t\t* *\n");printf("\t\t\t* *\n");printf("\t\t\t*********************************************\n");sleep(2);}void show() {system("clear");printf("\t\t\t**********************************************\n");printf("\t\t\t* *\n");printf("\t\t\t* UDP聊天室 *\n");printf("\t\t\t* *\n");printf("\t\t\t* 1 注冊 *\n");printf("\t\t\t* 2 登錄 *\n");printf("\t\t\t* 3 退出 *\n");printf("\t\t\t* *\n");printf("\t\t\t* 請輸入選擇: *\n");printf("\t\t\t**********************************************\n"); }//防止空格影響 void SCAN_N() {char ch;while ((getchar()) != '\n' && ch != EOF);//消除非法輸入 }//登錄之后的聊天界面 int chatshow() {system("clear");printf("\t\t\t");time_show();printf("\t\t\t**********************************************\n");printf("\t\t\t* UDP聊天室!祝您聊天愉快! *\n");printf("\t\t\t* 用戶名:%s *\n", name);if (SendBuf.vip == 1){printf("\t\t\t* 尊貴的會員 *\n");}else{printf("\t\t\t* 普通用戶 *\n");}printf("\t\t\t* *\n");printf("\t\t\t* a 私聊 *\n");printf("\t\t\t* b 群聊 *\n");printf("\t\t\t* c 查看在線人數 *\n");printf("\t\t\t* d 發送表情 *\n");printf("\t\t\t* e 常用語 *\n");printf("\t\t\t* f 開通會員 *\n");printf("\t\t\t* g 禁言(需開通會員) *\n");printf("\t\t\t* h 踢人(需開通會員) *\n");printf("\t\t\t* i 查看聊天記錄 *\n");printf("\t\t\t* j 解禁 *\n");printf("\t\t\t* k 退出 *\n");printf("\t\t\t* 請輸入您的選擇: *\n");printf("\t\t\t**********************************************\n"); }//注冊 將注冊信息發送給服務器 進行注冊 這里是確認注冊信息的過程 int Register() {flag = 0;system("clear");SendBuf.cmd = reg;char pass1[20] = { 0 };char pass2[20] = { 0 };printf("\t\t\t注冊中......\n");printf("\n\n");printf("\t\t\t請輸入你的用戶名:\n");printf("\t\t\t");scanf("\t\t\t%s", SendBuf.username);SCAN_N();printf("\t\t\t請輸入你的密碼:\n");printf("\t\t\t");scanf("\t\t\t%s", pass1);SCAN_N();printf("\t\t\t請確認你的密碼:\n");printf("\t\t\t");scanf("\t\t\t%s", pass2);SCAN_N();if (strcmp(pass1, pass2) != 0){printf("\t\t\t密碼輸入不一致!請重新輸入密碼!\n");printf("請在此重新輸入你的密碼:\n");scanf("%s", pass2);}else{strcpy(SendBuf.password, pass1);} }//登錄 同上 確認登錄信息 int Login() {system("clear");SendBuf.cmd = log_in;printf("\t\t\t登錄中......\n");printf("\n\n");printf("\t\t\t請輸入你的賬號:\n");printf("\t\t\t");scanf("\t\t\t%s", SendBuf.username);SCAN_N();printf("\t\t\t請輸入你的密碼:\n");printf("\t\t\t");scanf("\t\t\t%s", SendBuf.password);}//處理登陸后的函數 int deal_login() {if (out == 1){out--;return Exit;}char choice2[10] = { 0 };char file[2048] = { 0 };char filename[50] = { 0 };int fd;while (1){chatshow();scanf("%s", choice2); //讀入用戶選擇的功能字母switch (choice2[0]){case 'a': //私聊 {system("clear"); //清屏if (flag == 23) //判斷是否被禁言{printf("\n\t\t\t您已經被禁言了!\n");sleep(2);break;}printf("\t\t\t請輸入對方的名字:\n");printf("\t\t\t");scanf("%s", SendBuf.toname);SCAN_N();printf("\t\t\t請輸入您想要說的話:\n");printf("\t\t\t");scanf("%s", SendBuf.message);SCAN_N();SendBuf.cmd = private_chat; //操作符 為私聊strcpy(SendBuf.username, name);if (strcmp(SendBuf.toname, name) == 0){sleep(1);system("clear");printf("\t\t\t不可以給自己發信息!\n");printf("\t\t\t請重新輸入用戶名!\n");break;}ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));/* 發送給服務器 我要私聊某某 */if (ret < 0){perror("sendto_pchat");exit(1);}sprintf(filename, "%s chat with %s.txt", name, SendBuf.toname);fd = open(filename, O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR);if (fd == -1){perror("open");exit(1);}sprintf(file, "%s 給 %s 發送了一條消息:%s", name, SendBuf.toname, SendBuf.message);ret = write(fd, file, strlen(file));if (ret == -1){perror("write");exit(1);}printf("\t\t\t\t發送中...\n");sleep(2);break;}case 'b'://群聊{system("clear");if (flag == 23) //同上{printf("\n\t\t\t您已經被禁言了!\n");sleep(2);break;}printf("\t\t\t請發送消息:\n");scanf("%s", SendBuf.message);SendBuf.cmd = group_chat;strcpy(SendBuf.username, name);ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));if (ret < 0){perror("sendto_groupchat");exit(1);}printf("\t\t\t發送中......\n");sleep(2);break;}case 'c': //查看在線人數{system("clear");SendBuf.cmd = online; //操作符 查看在線ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));if (ret < 0){perror("sendto_onlinenum");exit(1);}sleep(3); //注意如果人數很多 睡眠時間建議稍微長點 不然查看的效果很差break;}case 'd': //群發表情{system("clear");if (flag == 23){printf("\n\t\t\t您已經被禁言了!\n");sleep(2);break;}char choice3[10] = { 0 };SendBuf.cmd = face;printf("\t\t\t**************************\n");printf("\t\t\t1 感動 ≧◇≦ \n");printf("\t\t\t2 無奈 ╮( ̄▽  ̄)╭\n");printf("\t\t\t3 哭泣 T_T\n");printf("\t\t\t4 驚訝 ⊙?⊙\n");printf("\t\t\t5 喵 (= ̄ω ̄=)\n");printf("\t\t\t6 害羞 (# ̄▽ ̄#)\n");printf("\t\t\t請輸入你的選擇\n");scanf("%s", choice3);SendBuf.p_f = choice3[0];strcpy(SendBuf.username, name);ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));if (ret < 0){perror("sendto_face");exit(1);}printf("\t\t\t發送中......\n");sleep(2);break;}case 'e': //發送常用語{system("clear");if (flag == 23){printf("\n\t\t\t您已經被禁言了!\n");sleep(2);break;}char choice4[10] = { 0 };printf("\t\t\t請輸入對方的名字:\n");printf("\t\t\t");scanf("%s", SendBuf.toname);strcpy(SendBuf.username, name);SendBuf.cmd = send_useful;printf("\t\t\t**************************\n");printf("\t\t\t1 I see. 我明白了.\n");printf("\t\t\t2 My god! 天哪!\n");printf("\t\t\t3 No way! 不行!\n");printf("\t\t\t4 Cheer up! 振作起來!\n");printf("\t\t\t5 Good job! 做得好!\n");printf("\t\t\t6 Bless you! 祝福你!\n");printf("\t\t\t7 Thank you! 謝謝!\n");printf("\n\t\t請輸入你想發送的常用語:\n");scanf("%s", choice4);SCAN_N();SendBuf.p_u = choice4[0];if (strcmp(name, SendBuf.toname) == 0){sleep(1);system("clear");printf("\t\t\t不可以給自己發送常用語");printf("\t\t\t請重新輸入用戶名!\n");return -1;}ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));if (ret < 0){perror("sendto_useful");exit(1);}printf("\n\t\t正在發送...\n");sleep(2);break;}case 'f': //開通會員{system("clear");if (SendBuf.vip == 0){char a[2];system("clear");printf("\n\n\n\t\t\t您確定要支付十萬塊成為會員嗎?\n");printf("\n\t\t\t您確認支付嗎?(y/n)");scanf("%s", a);if (a[0] == 'y'){strcpy(SendBuf.username, name);SendBuf.vip = 1;SendBuf.cmd = Vip;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));if (ret < 0){perror("sendto_vip");exit(1);}printf("\n\n\t\t請稍等...\n");sleep(2);}else{break;}}else if (SendBuf.vip == 1){printf("您已經是會員了,無需再次開通!\n");}break;}case 'g': //禁言{if (SendBuf.vip == 1){system("clear");printf("請選擇您想要禁言的人:\n");scanf("%s", SendBuf.toname);SendBuf.cmd = shutup;strcpy(SendBuf.username, name);if (strcmp(SendBuf.toname, name) == 0){sleep(1);system("clear");printf("\t\t\t不可以禁言自己!\n");printf("\t\t\t請重新輸入用戶名!\n");break;}ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));if (ret < 0){perror("sendto_shutup1");exit(1);}printf("\n\n\t\t請稍等...\n");sleep(2);}else if (SendBuf.vip == 0){printf("您需要開通會員才能禁言別人哦!\n");}break;}case 'h': //踢人{if (SendBuf.vip == 1) //這里就不注意對方是不是會員了 會員之間相互踢還是可以的{system("clear");printf("請選擇您想要讓他下線的人:\n");scanf("%s", SendBuf.toname);SendBuf.cmd = kick;strcpy(SendBuf.username, name);ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));if (ret < 0){perror("sendto_kick1");exit(1);}printf("\n\n\t\t請稍等...\n");sleep(2);}else if (SendBuf.vip == 0){printf("您需要開通會員才能讓別人下線哦!");}break;}case 'i': //查看聊天記錄 {system("clear");char n[20];char filename1[50];char file1[2048];char kl;int fd1;int i = 0;printf("\n\n\n\n\n\n\t\t\t您想看和誰的聊天記錄呢?\n");scanf("%s", n);SCAN_N();sprintf(filename1, "%s chat with %s.txt", name, n);fd1 = open(filename1, O_RDONLY, S_IRUSR | S_IWUSR);if (fd1 == -1){system("clear");printf("\n\n\n\n\n\n\n\t\t\t您與%s還沒有聊天記錄!\n", n);break;}while (1){memset(&kl, 0, sizeof(kl));ssize_t read_bytes = read(fd1, &kl, sizeof(kl));if (read_bytes == -1){perror("read");return -1;}if (read_bytes == 0){break;}file1[i] = kl;i++;}file1[i] = '\0';printf("\n%s\n", file1);sleep(3);break;}case 'j': //解禁 {char x[2];if (flag == 0){system("clear");printf("\n\n\n\t\t\t您沒有被禁言!\n");}else if (flag == 23){if (SendBuf.vip == 0){system("clear");printf("\n\n\n\n\t\t\t您還沒有開通會員,請先開通會員!\n");}else if (SendBuf.vip == 1){system("clear");printf("\n\n\n\n\t\t\t您想現在解禁嗎!(y/n)\n");scanf("%s", x);SCAN_N();if (x[0] == 'y'){flag = 0;system("clear");printf("\n\n\n\t\t\t恭喜您成功解禁!\n");}}}break;}case 'k': //下線{system("clear");SendBuf.cmd = quit;strcpy(SendBuf.username, name);ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));if (ret < 0){perror("sendto_quit1");exit(1);}sleep(1);return Exit;}case 'q':return Exit;default:{system("clear");printf("\n\n\n\n");printf("\n\n\t\t請輸入a--z之間的選擇!\n");sleep(2);break;}}} }//接收服務器發送的結果的接口函數 void *Recv_Server(void *arg) {char q;int i;int length = sizeof(server_addr);while (1){ret = recvfrom(*(int *)arg, &RecvBuf, sizeof(RecvBuf), 0, (struct sockaddr *)&server_addr, &length);if (ret < 0){perror("recvfrom");exit(1);}switch (RecvBuf.result){case(private_chat) :{printf("\t\t\t%s 給你發了一條消息:%s\n", RecvBuf.fromname, RecvBuf.message);memset(&RecvBuf.result, 0, sizeof(RecvBuf.result));break;}case(Send_success) :{system("clear");printf("\t\t\t發送成功\n");memset(&RecvBuf.result, 0, sizeof(RecvBuf.result));break;}case(Send_failure) :{system("clear");printf("\t\t\t發送失敗,對方不在線\n");memset(&RecvBuf.result, 0, sizeof(RecvBuf.result));break;}case(Pchat_failure) :{system("clear");printf("\t\t\t對不起,對方不在線!\n");memset(&RecvBuf.result, 0, sizeof(RecvBuf.result));break;}case(group_chat) :{printf("\t\t\t%s 群發了一條消息:%s\n", RecvBuf.fromname, RecvBuf.message);memset(&RecvBuf.result, 0, sizeof(RecvBuf.result));break;}case(Gchat_failure) :{system("clear");printf("\t\t\t群聊失敗!\n");memset(&RecvBuf.result, 0, sizeof(RecvBuf.result));break;}case(online) :{system("clear");printf("\t\t\t當前在線好友人數: %d\n", RecvBuf.num);for (i = 0; i < RecvBuf.num; i++){printf("\t\t\t%s\n", RecvBuf.online_name[i]);}memset(&RecvBuf.result, 0, sizeof(RecvBuf.result));break;}case(face) :{char emoj1[20] = { 0 };switch (RecvBuf.p_f){case '1':{strcpy(emoj1, "感動 ≧◇≦");printf("\t\t\t%s 給大家發了一個表情:%s\n", RecvBuf.fromname, emoj1);break;}case '2':{strcpy(emoj1, "無奈 ╮( ̄▽  ̄)╭");printf("\t\t\t%s 給大家發了一個表情:%s\n", RecvBuf.fromname, emoj1);break;}case '3':{strcpy(emoj1, "哭泣 T_T");printf("\t\t\t%s 給大家發了一個表情:%s\n", RecvBuf.fromname, emoj1);break;}case '4':{strcpy(emoj1, "驚訝 ⊙?⊙");printf("\t\t\t%s 給大家發了一個表情:%s\n", RecvBuf.fromname, emoj1);break;}case '5':{strcpy(emoj1, "喵 (= ̄ω ̄=)");printf("\t\t\t%s 給大家發了一個表情:%s\n", RecvBuf.fromname, emoj1);break;}case '6':{strcpy(emoj1, "害羞 (# ̄▽ ̄#)");printf("\t\t\t%s 給大家發了一個表情:%s\n", RecvBuf.fromname, emoj1);break;}}break;}case(face_failure) :{system("clear");printf("發送失敗,沒有該表情!\n");sleep(2);memset(&RecvBuf.result, 0, sizeof(RecvBuf.result));break;}case (send_useful) :{char ue[50];switch (RecvBuf.p_u){case '1':strcpy(ue, "I see. 我明白了.");printf("\t\t\t%s給你發送了一句常用語:%s\n", RecvBuf.fromname, ue);break;case '2':strcpy(ue, "My god! 天哪!");printf("\t\t\t%s給你發送了一句常用語:%s\n", RecvBuf.fromname, ue);break;case '3':strcpy(ue, "3 No way! 不行!");printf("\t\t\t%s給你發送了一句常用語:%s\n", RecvBuf.fromname, ue);break;case '4':strcpy(ue, "Cheer up! 振作起來!");printf("\t\t\t%s給你發送了一句常用語:%s\n", RecvBuf.fromname, ue);break;case '5':strcpy(ue, "Good job! 做得好!");printf("\t\t\t%s給你發送了一句常用語:%s\n", RecvBuf.fromname, ue);break;case '6':strcpy(ue, "Bless you! 祝福你!");printf("\t\t\t%s給你發送了一句常用語:%s\n", RecvBuf.fromname, ue);break;case '7':strcpy(ue, "Thank you! 謝謝!");printf("\t\t\t%s給你發送了一句常用語:%s\n", RecvBuf.fromname, ue);break;}break;}case(vip_success) :{printf("\t\t\t恭喜您成功開通會員\n");sleep(2);break;}case(shutup) :{flag = 23;printf("\t\t\t%s已經把您禁言了!\n", RecvBuf.fromname);break;}case(shutup_success) :{printf("\t\t\t禁言成功!\n");sleep(2);break;}case(shutup_failure) :{printf("\t\t\t對方不在線,禁言失敗!\n");break;}case(kick) :{out = 1;printf("\t\t\t您已經被%s踢出了聊天室,請重新登錄!\n", RecvBuf.fromname);printf("\t\t\t輸入q返回!\n");break;}case(kick_success) :{printf("\t\t\t踢人成功!\n");sleep(2);break;}case(kick_failure) :{printf("\t\t\t對方不在線,踢人失敗!\n");break;}case(quit) :{system("clear");printf("您已經成功下線!\n");sleep(2);break;}}} }int main() {int length = sizeof(server_addr);char choice[10] = { 0 };pthread_t tid;sockfd = socket(PF_INET, SOCK_DGRAM, 0); //創建套接字if (-1 == sockfd){perror("sockt");exit(1);}bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = PF_INET;server_addr.sin_port = PORT;server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");welcome();while (1){show();scanf("%s", choice);switch (atoi(&choice[0])){case 1: //注冊 {if (Register() == -12){break;}else{ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));if (ret < 0){perror("sendto_register");exit(1);}bzero(&SendBuf, sizeof(SendBuf));ret = recvfrom(sockfd, &RecvBuf, sizeof(RecvBuf), 0, (struct sockaddr *)&server_addr, &length);if (ret < 0){perror("recvfrom_register");exit(1);}if (RecvBuf.result == reg_success){printf("\n\n\t\t\t恭喜您注冊成功!\n");}else if (RecvBuf.result == existing){printf("\n\n\t\t\t該賬戶已被注冊!請重新注冊!\n");}sleep(2);break;}}case 2: //登錄{if (Login() == -14){break;}else{ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, sizeof(server_addr));if (ret < 0){perror("sendto_login");exit(1);}bzero(&SendBuf, sizeof(SendBuf));ret = recvfrom(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&server_addr, &length);if (ret < 0){perror("recvfrom_login");exit(1);}if (SendBuf.result == log_success){printf("\n\n\t\t\t恭喜你登錄成功!\n");strcpy(name, SendBuf.username);sleep(2);ret = pthread_create(&tid, NULL, (void *)Recv_Server, (void *)&sockfd); //起一個線程專門用來接收服務器發送給客戶端的結果反饋if (ret < 0){perror("pthread_create");exit(1);}pthread_detach(tid);ret = deal_login();if (ret == Exit){break;}}else if (SendBuf.result == logged){printf("\n\n\t\t\t賬號已登錄!\n");}else if (SendBuf.result == log_error){printf("\n\n\t\t\t賬號或密碼錯誤,請重新登錄!\n");}}break;}case 3:{bye();system("clear");exit(1);break;}default:{system("clear");printf("\n\n\n\n");printf("\n\n\t\t請輸入1--3之間的選擇!\n");sleep(2);break;}}}return 0; }

    server_function.h

    #ifndef _SERVER_H_ #define _SERVER_H_#include "chat.h"struct info {char username[20]; //用戶名 char password[20]; //密碼 int cmd; //提取操作類型 int result; //返回標記int port; //端口號char message[50]; //保存信息char toname[20]; //發送給誰char fromname[20]; //從誰那里接收char online_name[20][20]; //在線人員名單int num;int p_f;char emoj[20]; //表情int p_u;char useful[20];int vip;char question[50];char answer[50];char file_name[50];char file_content[2048]; };struct node {struct sockaddr_in client_addr; //保存客戶地址char name[20]; //記錄客戶姓名struct node *next; //指向下一個用戶 }; /*sockaddr_in 是internet環境下套接字的地址形式;;sockaddr_in在頭文件#include<netinet/in.h>或#include <arpa/inet.h>中定義*/typedef struct node Node; //起別名 簡化結構體 取名為 Node 用Node創建新結構體 存儲客戶信息 typedef Node *Lnode; //同樣 結構體取指針別名 對應的函數返回值是結構體類型//注冊函數 void register1();//登錄函數 void login(struct sockaddr_in tmp_addr);//處理私聊 int deal_private(struct sockaddr_in tmp_addr);//處理群聊 同上 int deal_group(struct sockaddr_in tmp_addr);//顯示在線人數 int deal_online();//處理群發表情 同上 int deal_face(struct sockaddr_in tmp_addr);//處理發送常用語 同上 int deal_useful(struct sockaddr_in tmp_addr);//處理vip int deal_vip(struct sockaddr_in tmp_addr);//處理禁言 同上 int deal_shutup(struct sockaddr_in tmp_addr);//處理踢人 同上 int deal_kick(struct sockaddr_in tmp_addr);//處理下線 int deal_quit();#endif

    server_main.c

    #include "serverfunction.h" #include "chat.h"struct info RecvBuf; //接收方 的信息保存 struct info SendBuf; //發送方 的信息保存sqlite3 *ppdb = NULL; //打開一個數據庫實例 int ret; int sockfd; Lnode head = NULL; //創建第一個節點//注冊函數 void register1() {char sql[100] = { 0 };sprintf(sql, "insert into chat(username,password,vip) values('%s','%s','%d')", RecvBuf.username, RecvBuf.password, RecvBuf.vip);/*將數據插入到 sql數據庫中,上述語句在執行完sprintf語句后,sql中保存的是INSERT語句字符串,可實現正確的插入。*/char *errmsg = NULL; //保存 錯誤的原因int ret;ret = sqlite3_exec(ppdb, sql, NULL, NULL, &errmsg); /*如果沒有成功創建數據庫實例則報錯(參考https://www.cnblogs.com/zfyouxi/p/5258589.html*/if (ret != SQLITE_OK){perror("sqlite3_exec2");SendBuf.result = existing; //賬號已存在printf("%s is insert failure:%s\n\n", RecvBuf.username, errmsg); //輸出錯因return;}//沒有報錯即成功printf("user insert success!yohoo~\n\n");SendBuf.result = reg_success; }//登錄函數 void login(struct sockaddr_in tmp_addr) {char sql[100] = { 0 };char **Result = NULL; //返回記錄,二維數組int nrow; //查找出的 行數int ncolumn; //查找出的 列數int ret;int i;sprintf(sql, "select username, password ,vip from chat where username = '%s' and password = '%s'", RecvBuf.username, RecvBuf.password);//查詢語句 查看登錄的用戶信息ret = sqlite3_get_table(ppdb, sql, &Result, &nrow, &ncolumn, NULL);/* char **dbResult; 字符型的二重指針,將數據庫里sqlite3_get_table()出來的數據以字符的方式給dbResult。*/if (ret != SQLITE_OK) //未查詢到表單數據{perror("sqlite3_get_table_login");return;}if (1 == nrow) //如果chat表中已經有一個數據 同時數據的用戶名和現在準備登錄的用戶名相同 則不允許登錄{Lnode tmp = head->next;Lnode p = (Lnode)malloc(sizeof(Node)); //創建一個節點存儲用戶信息if (p == NULL){printf("FAILURE!\n\n");return;}while (tmp != head){if (!strcmp(tmp->name, Result[3])){printf("您的賬號已登錄!\n\n");SendBuf.result = logged;return;}tmp = tmp->next;}SendBuf.result = log_success;strcpy(p->name, Result[3]); //存儲用戶名字strcpy(SendBuf.username, Result[3]);SendBuf.vip = *(Result[5]) - 48;p->client_addr.sin_family = tmp_addr.sin_family;p->client_addr.sin_port = tmp_addr.sin_port;p->client_addr.sin_addr.s_addr = tmp_addr.sin_addr.s_addr;printf("記錄到 %s 的端口號是 : %d\n", p->name, p->client_addr.sin_port);p->next = head->next;head->next = p;printf("%s 處于登錄狀態!\n\n", Result[3]);}else{SendBuf.result = log_error;printf("您的賬號或密碼錯誤,請重新登錄!\n\n");} }//處理私聊 int deal_private(struct sockaddr_in tmp_addr) {int postion = 0; //創建一個標志位Lnode tmp = head->next;while (tmp != head){if (strcmp(tmp->name, RecvBuf.toname) == 0) //查詢 找到 用戶名和接收名 相同 發送信息過去{postion = 1;strcpy(SendBuf.message, RecvBuf.message);strcpy(SendBuf.fromname, RecvBuf.username);SendBuf.result = private_chat;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp->client_addr, sizeof(tmp->client_addr));if (ret == -1){perror("sendto_chat");exit(1);}break;}tmp = tmp->next;}if (postion){SendBuf.result = Send_success;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret == -1){perror("sendto_success");exit(1);}}else{SendBuf.result = Pchat_failure;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret == -1){perror("sendto_failure");exit(1);}} }//處理群聊 同上 int deal_group(struct sockaddr_in tmp_addr) {int postion = 0;Lnode tmp = head->next;while (tmp != head){if (tmp->client_addr.sin_port != tmp_addr.sin_port){postion = 1;SendBuf.result = group_chat;strcpy(SendBuf.fromname, RecvBuf.username);printf("%s\n", SendBuf.fromname);strcpy(SendBuf.message, RecvBuf.message);ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp->client_addr, sizeof(tmp->client_addr));if (ret < 0){perror("sendto_group_chat");exit(1);}}tmp = tmp->next;}if (1 == postion){SendBuf.result = Send_success;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret < 0){perror("sendto_group_chat_success");exit(1);}}else{SendBuf.result = Gchat_failure;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret < 0){perror("sendto_group_chat_failure");exit(1);}} }//顯示在線人數 int deal_online() {int i = 0;SendBuf.num = 0;Lnode tmp = head->next;while (tmp != head){SendBuf.num++;strcpy(SendBuf.online_name[i], tmp->name);i++;tmp = tmp->next;}SendBuf.result = online; }//處理群發表情 同上 int deal_face(struct sockaddr_in tmp_addr) {int postion = 0;Lnode tmp = head->next;while (tmp != head){if (tmp->client_addr.sin_port != tmp_addr.sin_port){postion = 1;SendBuf.result = face;strcpy(SendBuf.fromname, RecvBuf.username);SendBuf.p_f = RecvBuf.p_f;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp->client_addr, sizeof(tmp->client_addr));if (ret < 0){perror("sendto_face");exit(1);}}tmp = tmp->next;}if (1 == postion){SendBuf.result = Send_success;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret < 0){perror("sendto_face_success");exit(1);}}else{SendBuf.result = face_failure;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret < 0){perror("sendto_face_failure");exit(1);}} }//處理發送常用語 同上 int deal_useful(struct sockaddr_in tmp_addr) {int postion = 0;Lnode tmp = head->next;while (tmp != head){if (strcmp(tmp->name, RecvBuf.toname) == 0){postion = 1;SendBuf.result = send_useful;SendBuf.p_u = RecvBuf.p_u;strcpy(SendBuf.fromname, RecvBuf.username);ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp->client_addr, sizeof(tmp->client_addr));if (ret == -1){perror("sendto_useful");exit(1);}break;}tmp = tmp->next;}if (postion){SendBuf.result = Send_success;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret == -1){perror("sendto_success");exit(1);}}else{SendBuf.result = Send_failure;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret == -1){perror("sendto_failure");exit(1);}} }//處理vip int deal_vip(struct sockaddr_in tmp_addr) {char sql[100] = { 0 };sprintf(sql, "update chat set vip= %d where username = '%s';", RecvBuf.vip, RecvBuf.username);//更新數據庫 信息即可ret = sqlite3_exec(ppdb, sql, NULL, NULL, NULL);if (ret != SQLITE_OK){perror("sqlite3_exec");return;}SendBuf.vip = 1; //VIP 標志位 置一SendBuf.result = vip_success;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret == -1){perror("sendto_vip_failure");exit(1);}printf("%s 恭喜您成為了會員 ...\n", SendBuf.username);return 0;}//處理禁言 同上 int deal_shutup(struct sockaddr_in tmp_addr) {Lnode tmp = head->next;int postion = 0;while (tmp != head){if (strcmp(tmp->name, RecvBuf.toname) == 0){postion = 1;SendBuf.result = shutup;strcpy(SendBuf.fromname, RecvBuf.username);ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp->client_addr, sizeof(tmp->client_addr));if (ret < 0){perror("sendto_shutup");return;}}tmp = tmp->next;}if (postion){SendBuf.result = shutup_success;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret < 0){perror("sendto_shutup_success");return;}}else{SendBuf.result = shutup_failure;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret < 0){perror("sendto_shutup_failure");return;}} }//處理踢人 同上 int deal_kick(struct sockaddr_in tmp_addr) {int postion = 0;Lnode tmp = head->next;while (tmp != head){if (strcmp(tmp->name, RecvBuf.toname) == 0){postion = 1;SendBuf.result = kick;strcpy(SendBuf.fromname, RecvBuf.username);ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp->client_addr, sizeof(tmp->client_addr));if (ret < 0){perror("sendto_kick");return;}Lnode p = tmp->next; //借用指針將該處的人員刪除 將后面的人員連接上來 代替此處人員tmp->next = p->next;free(p);printf("%s logged out...\n", RecvBuf.username);break;}tmp = tmp->next;}if (postion == 1){SendBuf.result = kick_success;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret < 0){perror("sendto_kick_success");exit(1);}}else{SendBuf.result = kick_failure;ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&tmp_addr, sizeof(tmp_addr));if (ret < 0){perror("sendto_shutup_failure");exit(1);}} }//處理下線 int deal_quit() {Lnode tmp = head;//1.如果是頭結點if (tmp->next->next == head){if (strcmp(tmp->next->name, RecvBuf.username) == 0){Lnode p = tmp->next; //借用指針將該處的人員刪除 將后面的人員連接上來 代替此處人員tmp->next = p->next;free(p);printf("%s logged out...\n", RecvBuf.username);return;}tmp = tmp->next;}//2.不是頭結點while (tmp->next != head){if (strcmp(tmp->next->name, RecvBuf.username) == 0){SendBuf.result = quit;Lnode l = tmp->next;tmp->next = l->next;free(l);printf("%s logged out...\n", RecvBuf.username);break;}tmp = tmp->next;}return 0; }int main() {struct sockaddr_in server_addr; //創建服務器 地址struct sockaddr_in client_addr; //創建客戶端 地址int length;int position;char sql[100] = { 0 };head = (Lnode)malloc(sizeof(Node));if (NULL == head){printf("Malloc Failure!\n");return;}head->next = head;sockfd = socket(PF_INET, SOCK_DGRAM, 0); //創建服務平臺if (-1 == sockfd){perror("socket");exit(1);}bzero(&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = PORT;server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //地址確定為 127.0.0.1ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); //服務器地址綁定if (ret < 0){perror("bind");exit(1);}ret = sqlite3_open("chat.db", &ppdb); //如果存在 chat數據庫 打開(可能是第二次執行程序的時候if (ret != SQLITE_OK){perror("sqlite3_open");exit(1);}sprintf(sql, "create table if not exists chat (username text primary key, password text,vip integer);");/* 如果不存在chat數據庫 就創建一個chat */ret = sqlite3_exec(ppdb, sql, NULL, NULL, NULL);if (ret != SQLITE_OK){perror("sqlite3_exec1");exit(1);}while (1){length = sizeof(client_addr);ret = recvfrom(sockfd, &RecvBuf, sizeof(RecvBuf), 0, (struct sockaddr *)&client_addr, &length); //循環處理 接收信息if (ret < 0){perror("recvfrom");exit(1);}printf("Recv From Client %d\n", client_addr.sin_port); //輸出(地址) 接收自哪個客戶端printf("username is : %s\tpassword is : %s\n", RecvBuf.username, RecvBuf.password);switch (RecvBuf.cmd) //根據接收到的 信息類型 執行相應的函數{case (reg) : //注冊 {register1();ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&client_addr, sizeof(client_addr)); //打包信息if (ret < 0){perror("sendto_server_register");exit(1);}break;}case (log_in) : //登錄{login(client_addr);ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&client_addr, sizeof(client_addr));if (ret < 0){perror("sendto_server_log_in");exit(1);}break;}case (private_chat) : //私聊{deal_private(client_addr);break;}case(group_chat) : //群聊{deal_group(client_addr);break;}case(online) : //查看在線人數{deal_online();ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&client_addr, sizeof(client_addr));if (ret == -1){perror("sendto_online");}break;}case(face) : //群發表情{deal_face(client_addr);break;}case(send_useful) : //發送常用語{deal_useful(client_addr);break;}case(Vip) : //開通會員{deal_vip(client_addr);break;}case(shutup) : //禁言{deal_shutup(client_addr);break;}case(kick) : //踢人{deal_kick(client_addr);break;}case(quit) : //下線{deal_quit();ret = sendto(sockfd, &SendBuf, sizeof(SendBuf), 0, (struct sockaddr *)&client_addr, sizeof(client_addr));if (ret == -1){perror("sendto_quit");}break;}}}sqlite3_close(ppdb); //最后關閉數據庫return 0; }

    ?

    總結

    以上是生活随笔為你收集整理的方案二、三SELECT、UDP完成聊天室的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    99久久精品无码一区二区毛片 | 国产精品久久久av久久久 | 丰满妇女强制高潮18xxxx | 无码播放一区二区三区 | 巨爆乳无码视频在线观看 | 亚洲国产成人av在线观看 | 欧洲极品少妇 | 精品厕所偷拍各类美女tp嘘嘘 | 中文字幕乱码人妻二区三区 | 亚洲日韩av一区二区三区中文 | 中文精品无码中文字幕无码专区 | 欧美三级a做爰在线观看 | 高清国产亚洲精品自在久久 | 最近中文2019字幕第二页 | 国产97人人超碰caoprom | 久久亚洲日韩精品一区二区三区 | 日日躁夜夜躁狠狠躁 | 精品国精品国产自在久国产87 | 亚洲中文字幕无码中文字在线 | 人妻天天爽夜夜爽一区二区 | 55夜色66夜色国产精品视频 | 国产av一区二区三区最新精品 | 日本一本二本三区免费 | 人妻无码久久精品人妻 | 色综合久久久久综合一本到桃花网 | 欧美日韩色另类综合 | 精品久久久久香蕉网 | 荡女精品导航 | 中文字幕乱码人妻二区三区 | 中国女人内谢69xxxx | 日韩av无码一区二区三区 | 欧美激情内射喷水高潮 | 网友自拍区视频精品 | 男人和女人高潮免费网站 | 乱码av麻豆丝袜熟女系列 | 四虎国产精品一区二区 | 免费国产黄网站在线观看 | 国产亚洲日韩欧美另类第八页 | 免费乱码人妻系列无码专区 | аⅴ资源天堂资源库在线 | 天天拍夜夜添久久精品大 | 国产精品久免费的黄网站 | 亚洲熟女一区二区三区 | 亚洲国产欧美国产综合一区 | 国产午夜精品一区二区三区嫩草 | 欧美喷潮久久久xxxxx | 中文字幕无码乱人伦 | 亚洲熟悉妇女xxx妇女av | 2019午夜福利不卡片在线 | 欧美人与禽猛交狂配 | 欧美阿v高清资源不卡在线播放 | 成人无码精品一区二区三区 | 国产网红无码精品视频 | 樱花草在线社区www | 亚洲人亚洲人成电影网站色 | 欧美激情一区二区三区成人 | 高清无码午夜福利视频 | 国产av人人夜夜澡人人爽麻豆 | 人妻无码久久精品人妻 | 亚洲成av人影院在线观看 | 亚洲综合精品香蕉久久网 | 131美女爱做视频 | 成人亚洲精品久久久久 | 丰满护士巨好爽好大乳 | 日日天干夜夜狠狠爱 | 国产精品人人爽人人做我的可爱 | 亚洲人成网站在线播放942 | 久久久精品456亚洲影院 | 欧美真人作爱免费视频 | 永久免费观看国产裸体美女 | 成人影院yy111111在线观看 | 无码人妻久久一区二区三区不卡 | 97久久国产亚洲精品超碰热 | 成人动漫在线观看 | 又大又黄又粗又爽的免费视频 | 噜噜噜亚洲色成人网站 | 亚洲中文字幕乱码av波多ji | 老熟妇乱子伦牲交视频 | 高潮毛片无遮挡高清免费视频 | 极品尤物被啪到呻吟喷水 | av在线亚洲欧洲日产一区二区 | 狂野欧美激情性xxxx | 国产网红无码精品视频 | 国产精品高潮呻吟av久久 | 欧美 日韩 人妻 高清 中文 | 亚洲综合色区中文字幕 | 久久五月精品中文字幕 | 亚洲日韩乱码中文无码蜜桃臀网站 | 欧美35页视频在线观看 | 亚洲男人av天堂午夜在 | 精品亚洲成av人在线观看 | 国产亚洲欧美在线专区 | 日韩精品乱码av一区二区 | 在线 国产 欧美 亚洲 天堂 | 18精品久久久无码午夜福利 | 久久熟妇人妻午夜寂寞影院 | 亚洲国产精品无码久久久久高潮 | 乱人伦人妻中文字幕无码久久网 | 99re在线播放 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 野外少妇愉情中文字幕 | av无码电影一区二区三区 | 亚洲精品国产a久久久久久 | 无码任你躁久久久久久久 | 四虎永久在线精品免费网址 | 人妻夜夜爽天天爽三区 | 老司机亚洲精品影院 | 扒开双腿吃奶呻吟做受视频 | 麻豆国产97在线 | 欧洲 | 97精品人妻一区二区三区香蕉 | 无遮挡啪啪摇乳动态图 | 国产无遮挡吃胸膜奶免费看 | 精品偷拍一区二区三区在线看 | 51国偷自产一区二区三区 | 樱花草在线播放免费中文 | 国产偷抇久久精品a片69 | 久久精品中文闷骚内射 | а天堂中文在线官网 | 蜜臀aⅴ国产精品久久久国产老师 | 人人爽人人爽人人片av亚洲 | 日韩亚洲欧美精品综合 | 国产精品亚洲专区无码不卡 | 国产疯狂伦交大片 | 国产成人一区二区三区别 | 男人的天堂2018无码 | 妺妺窝人体色www婷婷 | 无套内谢老熟女 | 99精品国产综合久久久久五月天 | 人妻互换免费中文字幕 | 国产熟女一区二区三区四区五区 | 伊人久久婷婷五月综合97色 | 中文字幕无码免费久久9一区9 | 又湿又紧又大又爽a视频国产 | 国内少妇偷人精品视频免费 | 午夜精品久久久内射近拍高清 | 日本爽爽爽爽爽爽在线观看免 | 国产av一区二区三区最新精品 | 成人无码视频免费播放 | 成人免费视频在线观看 | 亚洲 a v无 码免 费 成 人 a v | 国产婷婷色一区二区三区在线 | 狠狠色丁香久久婷婷综合五月 | 国产美女极度色诱视频www | 国产精华av午夜在线观看 | 精品欧洲av无码一区二区三区 | 日日天干夜夜狠狠爱 | 久久99精品国产麻豆 | 精品亚洲韩国一区二区三区 | 极品尤物被啪到呻吟喷水 | 男女下面进入的视频免费午夜 | 蜜臀aⅴ国产精品久久久国产老师 | 久久精品国产一区二区三区肥胖 | av香港经典三级级 在线 | 亚洲综合在线一区二区三区 | 久久伊人色av天堂九九小黄鸭 | 亚洲综合在线一区二区三区 | 麻豆国产人妻欲求不满谁演的 | 蜜桃臀无码内射一区二区三区 | 精品无码国产一区二区三区av | 国产精品高潮呻吟av久久 | 装睡被陌生人摸出水好爽 | 国产av剧情md精品麻豆 | 日韩精品无码免费一区二区三区 | 亚洲最大成人网站 | 福利一区二区三区视频在线观看 | 狂野欧美性猛xxxx乱大交 | 日本高清一区免费中文视频 | 亚洲精品国产第一综合99久久 | 国产无遮挡又黄又爽免费视频 | 亚洲区小说区激情区图片区 | 日本熟妇乱子伦xxxx | 欧美日本免费一区二区三区 | 99久久亚洲精品无码毛片 | 欧美性猛交xxxx富婆 | 色综合天天综合狠狠爱 | 麻豆国产人妻欲求不满谁演的 | 天堂а√在线地址中文在线 | 全黄性性激高免费视频 | 免费无码午夜福利片69 | 午夜理论片yy44880影院 | 欧美日本精品一区二区三区 | 欧美成人家庭影院 | 亚洲熟熟妇xxxx | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 久久久久久国产精品无码下载 | 国产精品久久久久久亚洲影视内衣 | 国产极品美女高潮无套在线观看 | 曰本女人与公拘交酡免费视频 | 国产性生交xxxxx无码 | 亚洲人成人无码网www国产 | 1000部夫妻午夜免费 | 国产精品第一国产精品 | 亚洲国产午夜精品理论片 | 亚洲日韩乱码中文无码蜜桃臀网站 | 67194成是人免费无码 | 大胆欧美熟妇xx | 日韩av无码中文无码电影 | 欧美精品国产综合久久 | 夫妻免费无码v看片 | 在线а√天堂中文官网 | 日本精品人妻无码免费大全 | 日产精品高潮呻吟av久久 | 免费乱码人妻系列无码专区 | 亚洲人亚洲人成电影网站色 | 亚洲精品美女久久久久久久 | 亚洲色大成网站www | 亚洲国产av精品一区二区蜜芽 | 国产激情无码一区二区app | 久久精品视频在线看15 | 丝袜 中出 制服 人妻 美腿 | av无码不卡在线观看免费 | 人人澡人人透人人爽 | 少妇无套内谢久久久久 | 爽爽影院免费观看 | 麻豆蜜桃av蜜臀av色欲av | 国产绳艺sm调教室论坛 | 成人精品视频一区二区 | 动漫av网站免费观看 | 激情五月综合色婷婷一区二区 | 久久久亚洲欧洲日产国码αv | 牛和人交xxxx欧美 | 亚洲乱亚洲乱妇50p | 久久午夜无码鲁丝片 | 99精品久久毛片a片 | 日本护士xxxxhd少妇 | 日本精品高清一区二区 | 正在播放东北夫妻内射 | 国产特级毛片aaaaaaa高清 | 综合网日日天干夜夜久久 | 欧美喷潮久久久xxxxx | 国模大胆一区二区三区 | 亚洲精品综合一区二区三区在线 | 又粗又大又硬毛片免费看 | 亚洲精品一区二区三区四区五区 | 亚洲无人区午夜福利码高清完整版 | 国产人妻精品一区二区三区 | 久久精品国产一区二区三区 | 国产av一区二区精品久久凹凸 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲七七久久桃花影院 | 久久亚洲精品中文字幕无男同 | 帮老师解开蕾丝奶罩吸乳网站 | 少妇的肉体aa片免费 | 一本久久伊人热热精品中文字幕 | 亚洲大尺度无码无码专区 | 永久免费观看国产裸体美女 | 久久久成人毛片无码 | 国产香蕉97碰碰久久人人 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲欧美精品aaaaaa片 | 清纯唯美经典一区二区 | 在线观看免费人成视频 | 欧洲精品码一区二区三区免费看 | 无码人妻精品一区二区三区不卡 | 少妇太爽了在线观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产精品a成v人在线播放 | 樱花草在线播放免费中文 | 亚洲色大成网站www | 18禁黄网站男男禁片免费观看 | 亚洲欧美国产精品久久 | 成人影院yy111111在线观看 | 国产乱人偷精品人妻a片 | 精品夜夜澡人妻无码av蜜桃 | 久久国产精品精品国产色婷婷 | 国产99久久精品一区二区 | 国产精品国产自线拍免费软件 | 西西人体www44rt大胆高清 | 激情国产av做激情国产爱 | 欧美肥老太牲交大战 | 亚洲成a人一区二区三区 | 亚洲爆乳精品无码一区二区三区 | 国产乱子伦视频在线播放 | 暴力强奷在线播放无码 | 亚洲成av人片在线观看无码不卡 | 无码人妻久久一区二区三区不卡 | 亚洲欧洲日本综合aⅴ在线 | 亚洲国产精品美女久久久久 | 国产精品亚洲综合色区韩国 | 国产福利视频一区二区 | 国产人妻大战黑人第1集 | 日韩亚洲欧美中文高清在线 | 男人扒开女人内裤强吻桶进去 | 国产成人精品久久亚洲高清不卡 | 亚洲国精产品一二二线 | 乌克兰少妇xxxx做受 | 亚洲第一无码av无码专区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 久久亚洲精品中文字幕无男同 | 又大又硬又黄的免费视频 | 无码人妻精品一区二区三区下载 | 久久这里只有精品视频9 | 久久午夜无码鲁丝片秋霞 | 久久国产自偷自偷免费一区调 | 5858s亚洲色大成网站www | 熟妇人妻无码xxx视频 | 97夜夜澡人人爽人人喊中国片 | 久久熟妇人妻午夜寂寞影院 | 丰满人妻精品国产99aⅴ | 亚洲国产精品一区二区第一页 | 骚片av蜜桃精品一区 | 成在人线av无码免费 | 国产人妻人伦精品1国产丝袜 | 国内精品人妻无码久久久影院 | 好爽又高潮了毛片免费下载 | 欧美精品无码一区二区三区 | 天天拍夜夜添久久精品大 | 在线观看免费人成视频 | 欧美日韩人成综合在线播放 | 久久国产精品二国产精品 | 在线精品亚洲一区二区 | 日本熟妇大屁股人妻 | 红桃av一区二区三区在线无码av | 成人欧美一区二区三区黑人免费 | 国产人妻久久精品二区三区老狼 | 中文无码精品a∨在线观看不卡 | 少妇一晚三次一区二区三区 | 免费无码的av片在线观看 | 999久久久国产精品消防器材 | 日本成熟视频免费视频 | 国内揄拍国内精品少妇国语 | 成年美女黄网站色大免费全看 | 亚洲 激情 小说 另类 欧美 | 无码精品国产va在线观看dvd | 亚洲无人区一区二区三区 | 亚洲成a人片在线观看无码3d | 帮老师解开蕾丝奶罩吸乳网站 | 麻豆成人精品国产免费 | 国产成人精品久久亚洲高清不卡 | 久久午夜无码鲁丝片 | 日韩人妻无码一区二区三区久久99 | 亚洲人交乣女bbw | 曰韩少妇内射免费播放 | 亚洲精品成人av在线 | 高潮毛片无遮挡高清免费视频 | 亚洲熟妇色xxxxx欧美老妇 | 国产特级毛片aaaaaaa高清 | 少妇被黑人到高潮喷出白浆 | 亚洲性无码av中文字幕 | 无码人妻出轨黑人中文字幕 | 国产又爽又黄又刺激的视频 | 少妇愉情理伦片bd | 亚洲人成无码网www | 欧洲vodafone精品性 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 亚洲国产日韩a在线播放 | 日韩欧美成人免费观看 | yw尤物av无码国产在线观看 | 中文字幕无码乱人伦 | 国产激情精品一区二区三区 | 日本饥渴人妻欲求不满 | 麻豆人妻少妇精品无码专区 | 一本色道久久综合亚洲精品不卡 | 久精品国产欧美亚洲色aⅴ大片 | 香港三级日本三级妇三级 | 无码播放一区二区三区 | 人人妻人人澡人人爽欧美精品 | 99久久精品国产一区二区蜜芽 | 色综合久久中文娱乐网 | 久久无码专区国产精品s | 大色综合色综合网站 | 国产绳艺sm调教室论坛 | 99久久精品午夜一区二区 | 亚洲精品欧美二区三区中文字幕 | 97精品人妻一区二区三区香蕉 | 久久婷婷五月综合色国产香蕉 | 四虎国产精品免费久久 | 亚洲中文字幕在线无码一区二区 | 国产一区二区三区精品视频 | 国产精品久久国产精品99 | 久久久久亚洲精品中文字幕 | 久久亚洲精品成人无码 | 4hu四虎永久在线观看 | 国产成人精品无码播放 | 岛国片人妻三上悠亚 | 色窝窝无码一区二区三区色欲 | 一本久久伊人热热精品中文字幕 | 国产午夜视频在线观看 | 野外少妇愉情中文字幕 | 97资源共享在线视频 | 久久无码专区国产精品s | 国产超级va在线观看视频 | 亚洲中文字幕无码中文字在线 | 国产成人无码午夜视频在线观看 | 永久免费观看国产裸体美女 | 精品无码国产自产拍在线观看蜜 | 国产精品亚洲五月天高清 | 漂亮人妻洗澡被公强 日日躁 | 欧美激情综合亚洲一二区 | 日本乱人伦片中文三区 | 国产亚洲精品久久久久久大师 | 人人妻人人澡人人爽人人精品 | 天堂亚洲2017在线观看 | 精品国产精品久久一区免费式 | 国产69精品久久久久app下载 | 成人精品天堂一区二区三区 | 国产特级毛片aaaaaaa高清 | 精品人妻中文字幕有码在线 | 初尝人妻少妇中文字幕 | 宝宝好涨水快流出来免费视频 | 亚洲va中文字幕无码久久不卡 | 亚洲乱码日产精品bd | 中文精品无码中文字幕无码专区 | 久久综合色之久久综合 | 欧美精品免费观看二区 | 亚洲精品成a人在线观看 | 精品人妻人人做人人爽夜夜爽 | 性史性农村dvd毛片 | 2019午夜福利不卡片在线 | 午夜精品一区二区三区在线观看 | 国内老熟妇对白xxxxhd | 欧美日韩一区二区综合 | 2020久久超碰国产精品最新 | 麻豆av传媒蜜桃天美传媒 | 久久97精品久久久久久久不卡 | 樱花草在线社区www | 精品少妇爆乳无码av无码专区 | 国产色xx群视频射精 | 日日碰狠狠躁久久躁蜜桃 | 国产麻豆精品精东影业av网站 | 国内综合精品午夜久久资源 | 精品 日韩 国产 欧美 视频 | 77777熟女视频在线观看 а天堂中文在线官网 | 久久综合色之久久综合 | 国产明星裸体无码xxxx视频 | 亚洲中文字幕无码中字 | 国产亚洲精品久久久久久久 | 中文字幕乱码人妻无码久久 | 亚洲娇小与黑人巨大交 | 国产97人人超碰caoprom | 4hu四虎永久在线观看 | 久久aⅴ免费观看 | 国产精品久久久久久亚洲影视内衣 | 日韩在线不卡免费视频一区 | 呦交小u女精品视频 | 呦交小u女精品视频 | 免费人成在线视频无码 | 国产亚洲人成在线播放 | 亚洲人交乣女bbw | 日日橹狠狠爱欧美视频 | 国产国产精品人在线视 | 亚洲人交乣女bbw | 亚洲 欧美 激情 小说 另类 | 妺妺窝人体色www婷婷 | 国产麻豆精品一区二区三区v视界 | 久久久久久国产精品无码下载 | 一本久久a久久精品亚洲 | 无码一区二区三区在线观看 | 国产在线无码精品电影网 | 漂亮人妻洗澡被公强 日日躁 | 中文字幕av伊人av无码av | 乱人伦人妻中文字幕无码久久网 | 国内精品久久毛片一区二区 | 日韩精品无码一本二本三本色 | 人人妻人人澡人人爽欧美精品 | 精品一区二区不卡无码av | 成人女人看片免费视频放人 | 色欲av亚洲一区无码少妇 | 精品国精品国产自在久国产87 | 中文字幕精品av一区二区五区 | 国产精品爱久久久久久久 | 久久精品国产精品国产精品污 | 樱花草在线播放免费中文 | 亚洲日本在线电影 | 国产人妻人伦精品 | 无码国模国产在线观看 | 一本精品99久久精品77 | 少妇无码吹潮 | 扒开双腿吃奶呻吟做受视频 | 国产成人精品三级麻豆 | 国产乱人无码伦av在线a | 成人性做爰aaa片免费看 | 精品国偷自产在线视频 | 综合网日日天干夜夜久久 | 免费国产成人高清在线观看网站 | 中文字幕无码日韩欧毛 | 国产精品无码一区二区三区不卡 | 在线观看免费人成视频 | 久久久久人妻一区精品色欧美 | aⅴ亚洲 日韩 色 图网站 播放 | 熟妇激情内射com | 领导边摸边吃奶边做爽在线观看 | 欧美变态另类xxxx | 亚洲一区二区三区四区 | 国产av一区二区精品久久凹凸 | 国语自产偷拍精品视频偷 | 日本xxxx色视频在线观看免费 | 在线天堂新版最新版在线8 | 国产人妻精品一区二区三区不卡 | 亚洲成色在线综合网站 | 亚洲国产精华液网站w | 午夜福利一区二区三区在线观看 | 又色又爽又黄的美女裸体网站 | 久久久久久a亚洲欧洲av冫 | 日日摸天天摸爽爽狠狠97 | 无码福利日韩神码福利片 | 成熟妇人a片免费看网站 | 51国偷自产一区二区三区 | 中文亚洲成a人片在线观看 | 日韩欧美中文字幕在线三区 | 黄网在线观看免费网站 | 丰满少妇高潮惨叫视频 | 动漫av网站免费观看 | 无码午夜成人1000部免费视频 | 日日碰狠狠躁久久躁蜜桃 | 久久久亚洲欧洲日产国码αv | 婷婷六月久久综合丁香 | 国产超级va在线观看视频 | 久久久无码中文字幕久... | 四虎国产精品免费久久 | 丰满岳乱妇在线观看中字无码 | 午夜性刺激在线视频免费 | 成熟妇人a片免费看网站 | 国产真人无遮挡作爱免费视频 | 久久久国产精品无码免费专区 | 人人妻人人藻人人爽欧美一区 | 国产激情无码一区二区app | 午夜性刺激在线视频免费 | www一区二区www免费 | 亚洲成av人影院在线观看 | 国产精品va在线播放 | 欧美日韩一区二区三区自拍 | 综合人妻久久一区二区精品 | 色偷偷人人澡人人爽人人模 | 日韩精品乱码av一区二区 | 日本乱偷人妻中文字幕 | 无码人妻av免费一区二区三区 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲毛片av日韩av无码 | 久久zyz资源站无码中文动漫 | 无码人妻丰满熟妇区五十路百度 | 沈阳熟女露脸对白视频 | 亚洲国产精品久久久久久 | 精品无码国产自产拍在线观看蜜 | 97精品人妻一区二区三区香蕉 | 亚洲精品一区二区三区在线观看 | 中文字幕无码热在线视频 | 丝袜美腿亚洲一区二区 | 国产乱人伦偷精品视频 | 高清无码午夜福利视频 | 久久精品国产亚洲精品 | 日韩成人一区二区三区在线观看 | 99久久无码一区人妻 | 精品日本一区二区三区在线观看 | 无码人妻出轨黑人中文字幕 | 亚洲va中文字幕无码久久不卡 | 中文字幕日产无线码一区 | 三上悠亚人妻中文字幕在线 | 国模大胆一区二区三区 | 久久国产精品萌白酱免费 | 久久精品国产大片免费观看 | 亚洲精品午夜国产va久久成人 | 美女张开腿让人桶 | 无码精品人妻一区二区三区av | 久久亚洲国产成人精品性色 | 国产乱码精品一品二品 | 亚洲国产成人a精品不卡在线 | 欧美熟妇另类久久久久久多毛 | 国精品人妻无码一区二区三区蜜柚 | 久久久久久久久蜜桃 | 欧美精品免费观看二区 | 在线成人www免费观看视频 | 亚洲日韩一区二区 | 午夜福利不卡在线视频 | 99久久精品午夜一区二区 | 欧美第一黄网免费网站 | 真人与拘做受免费视频 | 日韩精品无码一本二本三本色 | 亚洲高清偷拍一区二区三区 | 亚洲国产精品成人久久蜜臀 | 日日碰狠狠丁香久燥 | 日韩欧美群交p片內射中文 | 日日天干夜夜狠狠爱 | 欧美变态另类xxxx | 亚洲人亚洲人成电影网站色 | 亚洲人成网站在线播放942 | 99在线 | 亚洲 | 国产真实伦对白全集 | 亚洲欧美国产精品久久 | 99精品无人区乱码1区2区3区 | 毛片内射-百度 | 久久无码中文字幕免费影院蜜桃 | 欧美黑人乱大交 | 亚洲爆乳无码专区 | 亚洲欧洲中文日韩av乱码 | 中文字幕无线码免费人妻 | 性欧美牲交在线视频 | 日韩精品乱码av一区二区 | 亚洲综合无码一区二区三区 | 久久精品中文闷骚内射 | 成人无码影片精品久久久 | 精品一区二区三区无码免费视频 | 国产精品久久久久久亚洲影视内衣 | 国内揄拍国内精品少妇国语 | 亚洲の无码国产の无码影院 | 日本一卡2卡3卡四卡精品网站 | 国产莉萝无码av在线播放 | 3d动漫精品啪啪一区二区中 | 图片小说视频一区二区 | 亚洲一区二区三区 | 亚洲精品成人av在线 | 少妇愉情理伦片bd | 香港三级日本三级妇三级 | 国产精品亚洲а∨无码播放麻豆 | 亚洲午夜无码久久 | 国产精品毛多多水多 | 伊在人天堂亚洲香蕉精品区 | 国产精品二区一区二区aⅴ污介绍 | 亚洲成在人网站无码天堂 | 久久这里只有精品视频9 | 任你躁国产自任一区二区三区 | 成熟女人特级毛片www免费 | 亚洲自偷自拍另类第1页 | 亚洲欧洲无卡二区视頻 | 日产国产精品亚洲系列 | 老子影院午夜伦不卡 | 欧美成人高清在线播放 | 久久亚洲国产成人精品性色 | 亚洲国产av精品一区二区蜜芽 | 中文字幕无码日韩欧毛 | 在线播放无码字幕亚洲 | a在线亚洲男人的天堂 | 精品一区二区三区无码免费视频 | 国产精品爱久久久久久久 | 久久亚洲精品中文字幕无男同 | 国产无av码在线观看 | a片在线免费观看 | 精品乱子伦一区二区三区 | 国语精品一区二区三区 | 又粗又大又硬又长又爽 | 欧美三级a做爰在线观看 | 亚洲小说春色综合另类 | 国产香蕉尹人视频在线 | 东京一本一道一二三区 | 亚洲区小说区激情区图片区 | 久久久久久国产精品无码下载 | 国内揄拍国内精品少妇国语 | 国产人妻精品一区二区三区不卡 | 国语精品一区二区三区 | 国产精品18久久久久久麻辣 | 国产欧美亚洲精品a | 国产在线无码精品电影网 | 亚洲阿v天堂在线 | 国产一精品一av一免费 | 动漫av网站免费观看 | 久久99精品久久久久久 | 欧美熟妇另类久久久久久不卡 | 精品厕所偷拍各类美女tp嘘嘘 | 男女作爱免费网站 | 给我免费的视频在线观看 | 人妻无码αv中文字幕久久琪琪布 | 久久亚洲国产成人精品性色 | 少女韩国电视剧在线观看完整 | 一本大道久久东京热无码av | 国产激情无码一区二区 | 黑人玩弄人妻中文在线 | 国产另类ts人妖一区二区 | 亚洲码国产精品高潮在线 | 精品无码一区二区三区爱欲 | 久久久国产精品无码免费专区 | 老熟妇仑乱视频一区二区 | 欧美黑人巨大xxxxx | 国产精品久久久久久亚洲毛片 | 男人扒开女人内裤强吻桶进去 | 天天做天天爱天天爽综合网 | 中文字幕人成乱码熟女app | 97夜夜澡人人双人人人喊 | 亚洲一区二区三区国产精华液 | 免费人成网站视频在线观看 | 国产超级va在线观看视频 | www一区二区www免费 | 曰本女人与公拘交酡免费视频 | 成 人影片 免费观看 | 久久国语露脸国产精品电影 | 国内精品人妻无码久久久影院蜜桃 | 欧美阿v高清资源不卡在线播放 | 一本一道久久综合久久 | 夜夜躁日日躁狠狠久久av | 成人免费无码大片a毛片 | 内射巨臀欧美在线视频 | 免费无码av一区二区 | 国产精品亚洲综合色区韩国 | 国产av一区二区精品久久凹凸 | 久久精品中文闷骚内射 | 一本色道久久综合狠狠躁 | 无码人妻久久一区二区三区不卡 | 日本肉体xxxx裸交 | 亚拍精品一区二区三区探花 | 四虎影视成人永久免费观看视频 | 六十路熟妇乱子伦 | 婷婷丁香六月激情综合啪 | 久久精品人人做人人综合试看 | 2020最新国产自产精品 | 久久无码中文字幕免费影院蜜桃 | 国产精品-区区久久久狼 | 97无码免费人妻超级碰碰夜夜 | 大肉大捧一进一出视频出来呀 | 亚洲国产精华液网站w | 国内老熟妇对白xxxxhd | 亚洲熟熟妇xxxx | 精品人妻av区 | 国产精品久久久久久久影院 | 自拍偷自拍亚洲精品10p | 女人被男人躁得好爽免费视频 | 无码精品国产va在线观看dvd | 免费播放一区二区三区 | 一本色道久久综合亚洲精品不卡 | 一区二区三区高清视频一 | 少妇的肉体aa片免费 | 国产精品高潮呻吟av久久 | 色婷婷久久一区二区三区麻豆 | 国产成人无码专区 | 又大又紧又粉嫩18p少妇 | 成人亚洲精品久久久久 | 人人妻人人澡人人爽欧美精品 | 欧美乱妇无乱码大黄a片 | 亚洲日韩一区二区 | 毛片内射-百度 | 国产婷婷色一区二区三区在线 | 性欧美videos高清精品 | 精品人妻人人做人人爽夜夜爽 | 99久久精品国产一区二区蜜芽 | 亚洲精品国产a久久久久久 | 久久久久久久女国产乱让韩 | 国产婷婷色一区二区三区在线 | 亚洲国产欧美国产综合一区 | 亚洲精品www久久久 | 精品无码国产一区二区三区av | 国产在线aaa片一区二区99 | ass日本丰满熟妇pics | 国产99久久精品一区二区 | 欧美一区二区三区视频在线观看 | 少妇无套内谢久久久久 | 99久久精品日本一区二区免费 | 人人妻人人藻人人爽欧美一区 | 天天躁夜夜躁狠狠是什么心态 | 色欲综合久久中文字幕网 | 小泽玛莉亚一区二区视频在线 | 免费无码的av片在线观看 | 无码免费一区二区三区 | 精品乱码久久久久久久 | 97精品人妻一区二区三区香蕉 | 97久久国产亚洲精品超碰热 | 毛片内射-百度 | 亚洲日本va中文字幕 | 人妻人人添人妻人人爱 | 蜜臀av在线播放 久久综合激激的五月天 | 天天爽夜夜爽夜夜爽 | 人妻有码中文字幕在线 | 99精品视频在线观看免费 | 美女黄网站人色视频免费国产 | 午夜福利试看120秒体验区 | 欧美日韩综合一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 亚洲人成网站色7799 | 国产欧美熟妇另类久久久 | 中文精品无码中文字幕无码专区 | 无套内谢老熟女 | 亚洲 另类 在线 欧美 制服 | 在线 国产 欧美 亚洲 天堂 | 亚洲人成影院在线无码按摩店 | 77777熟女视频在线观看 а天堂中文在线官网 | 99久久婷婷国产综合精品青草免费 | 日韩人妻无码一区二区三区久久99 | 国产精品毛片一区二区 | 久久99热只有频精品8 | 无码帝国www无码专区色综合 | 亚洲欧美中文字幕5发布 | 最新版天堂资源中文官网 | 日韩欧美群交p片內射中文 | 少妇高潮一区二区三区99 | 亚洲天堂2017无码 | 亚洲精品国产精品乱码不卡 | 成人性做爰aaa片免费看 | 女高中生第一次破苞av | 99久久亚洲精品无码毛片 | 亚洲综合另类小说色区 | 亚洲毛片av日韩av无码 | 久久亚洲a片com人成 | 亚洲国产欧美国产综合一区 | 少妇性俱乐部纵欲狂欢电影 | 东北女人啪啪对白 | 中文字幕无码视频专区 | 三级4级全黄60分钟 | 爽爽影院免费观看 | 亚洲精品国产第一综合99久久 | 俺去俺来也在线www色官网 | 国产香蕉97碰碰久久人人 | 国产精品无码永久免费888 | 久久无码人妻影院 | 牛和人交xxxx欧美 | 无码任你躁久久久久久久 | 久久久久亚洲精品中文字幕 | 欧美喷潮久久久xxxxx | 国产农村乱对白刺激视频 | 日本欧美一区二区三区乱码 | 夜夜高潮次次欢爽av女 | 国产97色在线 | 免 | 国产亚洲tv在线观看 | 国产人妻人伦精品1国产丝袜 | 亚洲色大成网站www国产 | 色婷婷久久一区二区三区麻豆 | 好爽又高潮了毛片免费下载 | 国内精品人妻无码久久久影院蜜桃 | 欧美性猛交内射兽交老熟妇 | 免费中文字幕日韩欧美 | 成人av无码一区二区三区 | 麻豆国产丝袜白领秘书在线观看 | 国内精品久久久久久中文字幕 | 男人扒开女人内裤强吻桶进去 | 国产无遮挡又黄又爽又色 | 成人片黄网站色大片免费观看 | 丁香花在线影院观看在线播放 | 欧美第一黄网免费网站 | 四十如虎的丰满熟妇啪啪 | 久久亚洲中文字幕精品一区 | 亚洲人交乣女bbw | 丰满少妇女裸体bbw | 青青青手机频在线观看 | 欧美日韩视频无码一区二区三 | 一个人看的www免费视频在线观看 | 久久久久久九九精品久 | 亚洲色偷偷偷综合网 | 欧洲精品码一区二区三区免费看 | 无码乱肉视频免费大全合集 | 午夜嘿嘿嘿影院 | 99久久婷婷国产综合精品青草免费 | 国产特级毛片aaaaaaa高清 | 欧美精品无码一区二区三区 | 亚洲国产成人a精品不卡在线 | 好男人社区资源 | 秋霞成人午夜鲁丝一区二区三区 | 色妞www精品免费视频 | 国产精品人人妻人人爽 | 国产无遮挡吃胸膜奶免费看 | 国产午夜无码视频在线观看 | 999久久久国产精品消防器材 | 亚洲第一网站男人都懂 | 国产明星裸体无码xxxx视频 | 亚洲精品国偷拍自产在线麻豆 | 欧美人与善在线com | 国产香蕉97碰碰久久人人 | 国产成人精品无码播放 | 成年美女黄网站色大免费全看 | 精品厕所偷拍各类美女tp嘘嘘 | 午夜精品久久久内射近拍高清 | 欧美丰满熟妇xxxx性ppx人交 | 极品尤物被啪到呻吟喷水 | 天天摸天天碰天天添 | 亚洲精品中文字幕乱码 | 夜夜躁日日躁狠狠久久av | 少妇激情av一区二区 | 久久久精品456亚洲影院 | 1000部啪啪未满十八勿入下载 | 强开小婷嫩苞又嫩又紧视频 | 国产精品亚洲lv粉色 | 国产熟女一区二区三区四区五区 | 国产精品二区一区二区aⅴ污介绍 | 国产亚洲日韩欧美另类第八页 | 欧美日韩色另类综合 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 成人欧美一区二区三区黑人 | 中文无码成人免费视频在线观看 | 波多野结衣av一区二区全免费观看 | 亚洲 高清 成人 动漫 | 国产精品免费大片 | 久久久精品欧美一区二区免费 | 国产免费久久精品国产传媒 | 国产另类ts人妖一区二区 | 欧美国产日韩亚洲中文 | 欧美日韩在线亚洲综合国产人 | 国产精品99久久精品爆乳 | 中文字幕无码av波多野吉衣 | 中文字幕无码人妻少妇免费 | 天堂а√在线中文在线 | 欧洲欧美人成视频在线 | 精品人妻av区 | 人人爽人人澡人人人妻 | 国产熟女一区二区三区四区五区 | 亚洲自偷自偷在线制服 | 国产亚洲人成a在线v网站 | 天海翼激烈高潮到腰振不止 | yw尤物av无码国产在线观看 | 亚洲va中文字幕无码久久不卡 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 成人免费视频在线观看 | 欧美三级a做爰在线观看 | 午夜不卡av免费 一本久久a久久精品vr综合 | аⅴ资源天堂资源库在线 | 国产成人无码a区在线观看视频app | 乱人伦人妻中文字幕无码 | 国内少妇偷人精品视频 | 亚洲乱码国产乱码精品精 | 婷婷丁香五月天综合东京热 | 国产成人无码区免费内射一片色欲 | 精品无人国产偷自产在线 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲の无码国产の无码步美 | 国产手机在线αⅴ片无码观看 | 丝袜美腿亚洲一区二区 | 国产精品久久久久久无码 | 亚洲国产精品一区二区第一页 | 丰满肥臀大屁股熟妇激情视频 | 国产欧美熟妇另类久久久 | 高潮毛片无遮挡高清免费视频 | 99国产欧美久久久精品 | 任你躁国产自任一区二区三区 | 国产精品美女久久久 | 粉嫩少妇内射浓精videos | 日日摸日日碰夜夜爽av | 国产午夜亚洲精品不卡 | 国产69精品久久久久app下载 | 高中生自慰www网站 | 成年美女黄网站色大免费全看 | 国产色视频一区二区三区 | 中文字幕人妻丝袜二区 | 俄罗斯老熟妇色xxxx | 色综合天天综合狠狠爱 | 国产亚洲精品久久久ai换 | 国产超级va在线观看视频 | 久久久中文字幕日本无吗 | 国产精品嫩草久久久久 | 久久亚洲中文字幕无码 | 青青久在线视频免费观看 | 亚洲熟女一区二区三区 | 日本爽爽爽爽爽爽在线观看免 | 岛国片人妻三上悠亚 | 国产精品美女久久久网av | 国产无遮挡又黄又爽又色 | 一本色道婷婷久久欧美 | 亚洲精品中文字幕久久久久 | 色综合久久88色综合天天 | 永久免费精品精品永久-夜色 | 久久99精品久久久久久动态图 | 久久综合香蕉国产蜜臀av | 免费中文字幕日韩欧美 | 国产精品毛多多水多 | 精品aⅴ一区二区三区 | 九一九色国产 | 国产另类ts人妖一区二区 | 麻豆精品国产精华精华液好用吗 | 无码国模国产在线观看 | 日本一卡二卡不卡视频查询 | 无码帝国www无码专区色综合 | 国产欧美熟妇另类久久久 | 欧洲精品码一区二区三区免费看 | 少妇无码一区二区二三区 | 少妇无码av无码专区在线观看 | 丰腴饱满的极品熟妇 | 日产精品99久久久久久 | 国产免费久久久久久无码 | 18无码粉嫩小泬无套在线观看 | 国产精品无码永久免费888 | 精品无码国产一区二区三区av | 亚洲国产精品久久久久久 | 久久视频在线观看精品 | 98国产精品综合一区二区三区 | 国内少妇偷人精品视频 | 国产片av国语在线观看 | 少妇高潮一区二区三区99 | 一本久久a久久精品vr综合 | 亚洲欧洲中文日韩av乱码 | 久久国产精品二国产精品 | 亚洲 日韩 欧美 成人 在线观看 | 欧美熟妇另类久久久久久不卡 | 亚洲呦女专区 | 日韩av无码一区二区三区 | 国产无遮挡又黄又爽免费视频 | 九九综合va免费看 | 亚洲国产一区二区三区在线观看 | 纯爱无遮挡h肉动漫在线播放 | 无套内谢的新婚少妇国语播放 | 中文字幕乱码亚洲无线三区 | 精品国产国产综合精品 | 国产精品久久福利网站 | 国产麻豆精品一区二区三区v视界 | 夜精品a片一区二区三区无码白浆 | 久久久久99精品国产片 | 在线观看国产一区二区三区 | 亚洲伊人久久精品影院 | 俺去俺来也www色官网 | 亚洲综合精品香蕉久久网 | 人人妻人人藻人人爽欧美一区 | 色欲av亚洲一区无码少妇 | 国产办公室秘书无码精品99 | 88国产精品欧美一区二区三区 | 国产无套粉嫩白浆在线 | 亚洲精品美女久久久久久久 | 一本久久a久久精品vr综合 | 清纯唯美经典一区二区 | 亚洲色偷偷男人的天堂 | 亚洲一区二区三区播放 | 国产精品久久久午夜夜伦鲁鲁 | 精品国产aⅴ无码一区二区 | 蜜桃av抽搐高潮一区二区 | 少妇厨房愉情理9仑片视频 | 人妻无码久久精品人妻 | 亚洲国产精品一区二区美利坚 | 国产一区二区不卡老阿姨 | 内射欧美老妇wbb | 亚洲色在线无码国产精品不卡 | 中文精品无码中文字幕无码专区 | 久久午夜无码鲁丝片 | 无码人妻久久一区二区三区不卡 | 日本熟妇乱子伦xxxx | 黑人玩弄人妻中文在线 | 国产sm调教视频在线观看 | 国产电影无码午夜在线播放 | 国产人妻精品一区二区三区 | 国产又粗又硬又大爽黄老大爷视 | 美女黄网站人色视频免费国产 | 精品人妻av区 | 亚洲精品久久久久久久久久久 | 无码国产乱人伦偷精品视频 | 国产高清av在线播放 | 日本一卡二卡不卡视频查询 | 国产精品二区一区二区aⅴ污介绍 | 日韩 欧美 动漫 国产 制服 | 真人与拘做受免费视频 | 亚洲一区二区三区四区 | 欧美激情一区二区三区成人 | 少妇愉情理伦片bd | 超碰97人人射妻 | 亚洲成av人片天堂网无码】 | 久久精品国产一区二区三区 | 国产国语老龄妇女a片 | 奇米影视7777久久精品人人爽 | 亚洲小说春色综合另类 | 日韩欧美中文字幕在线三区 | 日韩欧美成人免费观看 | 自拍偷自拍亚洲精品10p | 领导边摸边吃奶边做爽在线观看 | 天天综合网天天综合色 | 精品一二三区久久aaa片 | 欧美成人免费全部网站 | 国产乱人伦av在线无码 | 国产乱码精品一品二品 | 亚洲人亚洲人成电影网站色 | 中文字幕无码乱人伦 | 中文字幕无码av激情不卡 | 水蜜桃色314在线观看 | 中文字幕乱码人妻无码久久 | 国内揄拍国内精品少妇国语 | 一本久道久久综合婷婷五月 | 精品一区二区不卡无码av | 青青久在线视频免费观看 | 久久精品成人欧美大片 | 欧美熟妇另类久久久久久多毛 | 国产99久久精品一区二区 | 久久亚洲精品成人无码 | 欧美性生交xxxxx久久久 | 1000部夫妻午夜免费 | 国内老熟妇对白xxxxhd | 又大又硬又黄的免费视频 | 国产成人无码a区在线观看视频app | 国产精品久久久久久亚洲毛片 | 国产成人无码av片在线观看不卡 | 精品夜夜澡人妻无码av蜜桃 | 成年美女黄网站色大免费视频 | 99久久人妻精品免费二区 | 中文字幕无码免费久久9一区9 | 中文无码精品a∨在线观看不卡 | 亚洲熟熟妇xxxx | 九九久久精品国产免费看小说 | ass日本丰满熟妇pics | 久久成人a毛片免费观看网站 | 高清不卡一区二区三区 | 久久无码中文字幕免费影院蜜桃 | aa片在线观看视频在线播放 | 嫩b人妻精品一区二区三区 | 牲欲强的熟妇农村老妇女视频 | 特大黑人娇小亚洲女 | 免费播放一区二区三区 | 国产精品va在线观看无码 | 欧美日本精品一区二区三区 | 狂野欧美性猛xxxx乱大交 | 人人妻人人澡人人爽欧美一区 | 精品亚洲韩国一区二区三区 | 久久综合色之久久综合 | 国产深夜福利视频在线 | aa片在线观看视频在线播放 | 国语自产偷拍精品视频偷 | 国产明星裸体无码xxxx视频 | 国产精品无码久久av | 人妻无码αv中文字幕久久琪琪布 | 狠狠cao日日穞夜夜穞av | 成在人线av无码免费 | 久久国产精品_国产精品 | 国产人妻久久精品二区三区老狼 | 久久精品成人欧美大片 | 国产一区二区三区精品视频 | 无码人妻出轨黑人中文字幕 | 国产激情一区二区三区 | 亚洲 另类 在线 欧美 制服 | 国产成人无码av在线影院 | 亚洲s色大片在线观看 | 国产美女极度色诱视频www | 亚洲综合在线一区二区三区 | 国产精品.xx视频.xxtv | 国产艳妇av在线观看果冻传媒 | 国产精品久久久久久亚洲影视内衣 | 欧美色就是色 | yw尤物av无码国产在线观看 | 亚洲精品综合五月久久小说 | 亚洲区欧美区综合区自拍区 | 亚洲精品中文字幕乱码 | 国产亚洲欧美日韩亚洲中文色 | 国产精品爱久久久久久久 | 亚洲乱码日产精品bd | 国产熟妇另类久久久久 | 国产精品久久久 | 丁香花在线影院观看在线播放 | 日日麻批免费40分钟无码 | 亚洲日本一区二区三区在线 | 久久精品国产大片免费观看 | 久久99精品久久久久婷婷 | 国产一区二区三区精品视频 | 一本久久a久久精品亚洲 | 亚洲一区二区三区香蕉 | 日本乱人伦片中文三区 | 人人妻人人澡人人爽人人精品浪潮 | 成人无码视频免费播放 | 亚洲国产午夜精品理论片 | 国产精品对白交换视频 | 青青草原综合久久大伊人精品 | 午夜不卡av免费 一本久久a久久精品vr综合 | 成人欧美一区二区三区 | 亚洲综合另类小说色区 | 狠狠色色综合网站 | 午夜时刻免费入口 | 色欲综合久久中文字幕网 | 久久久久久国产精品无码下载 | 纯爱无遮挡h肉动漫在线播放 | 狠狠色噜噜狠狠狠7777奇米 | 少女韩国电视剧在线观看完整 | 欧美性黑人极品hd | 亚洲成av人片在线观看无码不卡 | 99精品视频在线观看免费 | 国产乱人偷精品人妻a片 | 亚洲天堂2017无码 | 国产精品美女久久久网av | 永久免费观看国产裸体美女 | 久久aⅴ免费观看 | 日本又色又爽又黄的a片18禁 | 亚洲欧美色中文字幕在线 | 国产又爽又猛又粗的视频a片 | 色综合久久久无码网中文 | 青青青爽视频在线观看 | 亚洲国产精品毛片av不卡在线 | 伊人久久大香线蕉av一区二区 | 97夜夜澡人人爽人人喊中国片 | 野外少妇愉情中文字幕 | 婷婷五月综合缴情在线视频 | 日韩精品无码一本二本三本色 | 人妻中文无码久热丝袜 | 樱花草在线社区www | 久久综合九色综合欧美狠狠 | 欧美激情综合亚洲一二区 | 亚洲成a人片在线观看无码3d | 中文字幕无码日韩专区 | 好男人社区资源 | 欧美性生交xxxxx久久久 | 国产亚洲精品精品国产亚洲综合 | 又湿又紧又大又爽a视频国产 | 成人欧美一区二区三区黑人免费 | 精品日本一区二区三区在线观看 | 中文无码精品a∨在线观看不卡 | 装睡被陌生人摸出水好爽 | 97夜夜澡人人双人人人喊 | 性欧美疯狂xxxxbbbb | 国产精品福利视频导航 | 成人aaa片一区国产精品 | 成人一区二区免费视频 | 夜夜影院未满十八勿进 | 两性色午夜视频免费播放 | 少妇高潮喷潮久久久影院 | 亚洲午夜福利在线观看 | 日本欧美一区二区三区乱码 | 国产成人综合色在线观看网站 | 奇米影视888欧美在线观看 | 国产又爽又黄又刺激的视频 | 成在人线av无码免费 | 天天拍夜夜添久久精品大 | 狂野欧美性猛交免费视频 | 中文字幕乱码人妻二区三区 | 又大又黄又粗又爽的免费视频 | 久久久久人妻一区精品色欧美 | 色婷婷久久一区二区三区麻豆 | 国产亚洲欧美在线专区 | 欧美一区二区三区视频在线观看 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲精品一区二区三区大桥未久 | 久久人人爽人人爽人人片ⅴ | 国产精品-区区久久久狼 | 国产精品久久久午夜夜伦鲁鲁 | 国产欧美熟妇另类久久久 | 午夜丰满少妇性开放视频 | 成人试看120秒体验区 | 草草网站影院白丝内射 | 久久国语露脸国产精品电影 | 国产精品久久久一区二区三区 | 成人无码视频免费播放 | 久久精品国产一区二区三区 | 女人被爽到呻吟gif动态图视看 | 成人无码精品1区2区3区免费看 | 亚洲另类伦春色综合小说 | 男女下面进入的视频免费午夜 | 国产人妻大战黑人第1集 | 又湿又紧又大又爽a视频国产 | 国产婷婷色一区二区三区在线 | 日本www一道久久久免费榴莲 | 婷婷色婷婷开心五月四房播播 | 免费观看又污又黄的网站 | 国产亚洲人成在线播放 | 久久久久人妻一区精品色欧美 | 无码人妻精品一区二区三区下载 | 激情人妻另类人妻伦 | 性欧美熟妇videofreesex | 亚洲精品国偷拍自产在线观看蜜桃 | 国产日产欧产精品精品app | 少妇邻居内射在线 | 帮老师解开蕾丝奶罩吸乳网站 | 国产性生交xxxxx无码 | 欧美人与物videos另类 | 大胆欧美熟妇xx | 天堂久久天堂av色综合 | 亚洲男人av天堂午夜在 | 天堂а√在线地址中文在线 | 精品水蜜桃久久久久久久 | 国产精品18久久久久久麻辣 | 99国产精品白浆在线观看免费 | 久久国产精品偷任你爽任你 | 精品aⅴ一区二区三区 | 久久婷婷五月综合色国产香蕉 | 国语精品一区二区三区 | 免费无码一区二区三区蜜桃大 | 老熟女重囗味hdxx69 | 曰本女人与公拘交酡免费视频 | 日韩无套无码精品 | 国产情侣作爱视频免费观看 | 97se亚洲精品一区 | 正在播放东北夫妻内射 | 免费人成网站视频在线观看 | 日韩人妻无码一区二区三区久久99 | 亚洲综合精品香蕉久久网 | 国产亚洲日韩欧美另类第八页 | 久久久久久久人妻无码中文字幕爆 | 久久人人爽人人爽人人片av高清 | 成人性做爰aaa片免费看不忠 | 国产真实夫妇视频 | 精品国产一区av天美传媒 | 亚洲无人区一区二区三区 | 欧美一区二区三区 | 小鲜肉自慰网站xnxx | 熟妇人妻无乱码中文字幕 | 亚洲天堂2017无码 | 欧美性生交xxxxx久久久 | 亚洲成a人片在线观看无码 | 免费观看激色视频网站 | 午夜精品一区二区三区在线观看 | 久久国语露脸国产精品电影 | 久久aⅴ免费观看 | 日韩精品成人一区二区三区 | 日韩欧美成人免费观看 | 伦伦影院午夜理论片 | 久久zyz资源站无码中文动漫 | 色欲人妻aaaaaaa无码 | 一区二区三区高清视频一 | 天堂а√在线中文在线 | 亚洲一区av无码专区在线观看 | 日本精品人妻无码免费大全 | 久久精品国产一区二区三区 | aⅴ亚洲 日韩 色 图网站 播放 | 亚洲人交乣女bbw | 97久久精品无码一区二区 | 300部国产真实乱 | 欧美乱妇无乱码大黄a片 | 国产成人无码a区在线观看视频app | 欧美成人午夜精品久久久 | 狠狠综合久久久久综合网 | 麻花豆传媒剧国产免费mv在线 | 麻豆国产人妻欲求不满谁演的 | 一区二区三区乱码在线 | 欧洲 | 中文精品久久久久人妻不卡 | 天天躁夜夜躁狠狠是什么心态 | 蜜臀av无码人妻精品 | aⅴ在线视频男人的天堂 | 中文字幕乱码人妻二区三区 | 中文字幕人妻丝袜二区 | 久久国产自偷自偷免费一区调 | 国产精品无码一区二区桃花视频 | 牲交欧美兽交欧美 | 中文字幕精品av一区二区五区 | 欧美老人巨大xxxx做受 | 亚洲理论电影在线观看 | 中文字幕精品av一区二区五区 | 亚洲一区av无码专区在线观看 | 乱人伦中文视频在线观看 | a在线观看免费网站大全 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲精品一区二区三区四区五区 | 无码乱肉视频免费大全合集 | 伊人色综合久久天天小片 | 福利一区二区三区视频在线观看 | 久久亚洲a片com人成 | 又粗又大又硬毛片免费看 | 欧美成人午夜精品久久久 | 国产在线无码精品电影网 | 精品人人妻人人澡人人爽人人 | 成人亚洲精品久久久久 | 中文字幕乱妇无码av在线 | 日本丰满熟妇videos | 亚洲精品一区国产 | 蜜桃臀无码内射一区二区三区 | 好男人社区资源 | 中文字幕av日韩精品一区二区 | 亚洲一区二区三区香蕉 | 精品无码一区二区三区的天堂 | 俺去俺来也在线www色官网 | aⅴ在线视频男人的天堂 | 人人澡人人透人人爽 | 少女韩国电视剧在线观看完整 | 亚洲精品久久久久avwww潮水 | 亚洲男人av香蕉爽爽爽爽 | 国产精品欧美成人 | 国产无套内射久久久国产 | 99久久久国产精品无码免费 | a片免费视频在线观看 | 欧美放荡的少妇 | 国产成人无码专区 | 自拍偷自拍亚洲精品10p | 成人精品视频一区二区三区尤物 | 免费国产成人高清在线观看网站 | 玩弄中年熟妇正在播放 | 牛和人交xxxx欧美 | 一本加勒比波多野结衣 | av在线亚洲欧洲日产一区二区 | 人妻少妇被猛烈进入中文字幕 | 少妇久久久久久人妻无码 | 99久久人妻精品免费一区 | 最新国产麻豆aⅴ精品无码 | 免费观看激色视频网站 | 小泽玛莉亚一区二区视频在线 | 俺去俺来也www色官网 | 无码人妻丰满熟妇区毛片18 | 青青草原综合久久大伊人精品 | 欧美日韩综合一区二区三区 | 国产成人亚洲综合无码 | 人妻少妇精品视频专区 | 麻豆精品国产精华精华液好用吗 | 日日干夜夜干 | 国产精品久久久久7777 | 啦啦啦www在线观看免费视频 | 亚洲一区二区三区国产精华液 | 亚拍精品一区二区三区探花 | 麻豆精产国品 | 极品嫩模高潮叫床 | 强奷人妻日本中文字幕 | 久久人人97超碰a片精品 | 青草视频在线播放 | 未满小14洗澡无码视频网站 | 免费人成网站视频在线观看 | 夫妻免费无码v看片 | 国产av一区二区三区最新精品 | 亚洲国产成人a精品不卡在线 | 内射后入在线观看一区 | 国产精品无码成人午夜电影 | 成人无码精品1区2区3区免费看 | 久久综合激激的五月天 | 国产人妻精品午夜福利免费 | 亚洲精品一区二区三区在线 | 中文亚洲成a人片在线观看 | 国产suv精品一区二区五 | 夜精品a片一区二区三区无码白浆 | 久久午夜无码鲁丝片秋霞 | 亚洲综合无码久久精品综合 | 九一九色国产 | 白嫩日本少妇做爰 | 欧美日韩在线亚洲综合国产人 | 国产亲子乱弄免费视频 | 奇米影视888欧美在线观看 | 在线观看国产一区二区三区 | 亚洲中文字幕无码中文字在线 | 狠狠色丁香久久婷婷综合五月 | 鲁大师影院在线观看 | 红桃av一区二区三区在线无码av | 内射白嫩少妇超碰 | 鲁鲁鲁爽爽爽在线视频观看 | 日韩人妻无码一区二区三区久久99 | 香港三级日本三级妇三级 | 久久久中文字幕日本无吗 | 国产亚洲精品久久久久久大师 | 欧美熟妇另类久久久久久不卡 | 亚洲综合色区中文字幕 | 成在人线av无码免观看麻豆 | 99久久精品国产一区二区蜜芽 | 在线成人www免费观看视频 | 国产艳妇av在线观看果冻传媒 | 欧美日韩综合一区二区三区 | 国产精品亚洲综合色区韩国 | 国产网红无码精品视频 | 国产成人无码a区在线观看视频app | 秋霞成人午夜鲁丝一区二区三区 | 国产xxx69麻豆国语对白 | 国产尤物精品视频 | 中文精品无码中文字幕无码专区 | 天天爽夜夜爽夜夜爽 | 国产熟女一区二区三区四区五区 | 一本久道久久综合婷婷五月 | 中文字幕无码热在线视频 | av小次郎收藏 | 国产绳艺sm调教室论坛 | 在线播放亚洲第一字幕 | 俺去俺来也www色官网 | 亚洲区小说区激情区图片区 | 午夜免费福利小电影 | 日日麻批免费40分钟无码 | 久久精品人妻少妇一区二区三区 | 熟妇激情内射com | 日本饥渴人妻欲求不满 | 成人精品视频一区二区三区尤物 | 亚洲人成人无码网www国产 | 99国产精品白浆在线观看免费 | 亚洲第一无码av无码专区 | 人人妻人人澡人人爽人人精品 | 十八禁视频网站在线观看 | 国产九九九九九九九a片 | 成人精品视频一区二区三区尤物 | 激情人妻另类人妻伦 | 亚洲色无码一区二区三区 | 蜜桃臀无码内射一区二区三区 | 国产午夜手机精彩视频 | 久久久国产一区二区三区 | 日韩精品无码一区二区中文字幕 | 国产精品久久久久久亚洲影视内衣 | 久精品国产欧美亚洲色aⅴ大片 | 国产精品国产自线拍免费软件 | 天堂久久天堂av色综合 | 精品久久综合1区2区3区激情 | 美女张开腿让人桶 | 300部国产真实乱 | 久久综合色之久久综合 | av香港经典三级级 在线 | 国产网红无码精品视频 | 欧美真人作爱免费视频 | 亚洲七七久久桃花影院 | 成人精品一区二区三区中文字幕 | 久久久久久久久888 | 午夜不卡av免费 一本久久a久久精品vr综合 | 久久99精品国产麻豆 | 中文字幕久久久久人妻 | 人人澡人人透人人爽 | 精品水蜜桃久久久久久久 | 国产精品久久久午夜夜伦鲁鲁 | 国产精品毛片一区二区 | 丝袜美腿亚洲一区二区 | 久久亚洲精品中文字幕无男同 | 精品一区二区三区无码免费视频 | 午夜丰满少妇性开放视频 | 国精产品一区二区三区 | 一本久道久久综合婷婷五月 | 大肉大捧一进一出视频出来呀 | 色综合久久88色综合天天 | 精品久久8x国产免费观看 | 免费视频欧美无人区码 | 帮老师解开蕾丝奶罩吸乳网站 | 国产尤物精品视频 | 精品国产麻豆免费人成网站 | 国产精品二区一区二区aⅴ污介绍 | 亚洲日韩av一区二区三区四区 | 国产成人综合美国十次 | 婷婷丁香六月激情综合啪 | 午夜丰满少妇性开放视频 | 国产美女精品一区二区三区 | 亚洲综合在线一区二区三区 | 日产精品99久久久久久 | 欧美日本精品一区二区三区 | 色婷婷欧美在线播放内射 | 国产精品亚洲а∨无码播放麻豆 | 亚洲の无码国产の无码影院 | 日日麻批免费40分钟无码 | 国产精品久久久av久久久 | 精品国产国产综合精品 | 国产精品无码一区二区桃花视频 | 国产亚洲精品久久久久久国模美 | 欧美一区二区三区视频在线观看 | 国产激情无码一区二区 | 久久亚洲精品成人无码 | 午夜无码人妻av大片色欲 | 大肉大捧一进一出视频出来呀 | 中文毛片无遮挡高清免费 | 亚洲成av人综合在线观看 | 樱花草在线播放免费中文 | 天天躁日日躁狠狠躁免费麻豆 | 色婷婷久久一区二区三区麻豆 | 影音先锋中文字幕无码 | 天天拍夜夜添久久精品 | 中文字幕乱码亚洲无线三区 | 国产色精品久久人妻 | 在线播放亚洲第一字幕 | 久久99精品久久久久久 | 国产免费无码一区二区视频 | 性色av无码免费一区二区三区 | 国产成人久久精品流白浆 | 亚无码乱人伦一区二区 | 激情亚洲一区国产精品 | 欧美猛少妇色xxxxx | 免费国产成人高清在线观看网站 | 日本免费一区二区三区最新 | 精品一区二区不卡无码av | 精品一二三区久久aaa片 | 成人亚洲精品久久久久软件 | 亚洲日本va中文字幕 | 成人免费无码大片a毛片 | 伊人久久大香线蕉午夜 | 久久精品人人做人人综合试看 | 性色av无码免费一区二区三区 | 网友自拍区视频精品 | 国产三级精品三级男人的天堂 | 久久久久久av无码免费看大片 | 高清不卡一区二区三区 | 欧美肥老太牲交大战 | 中文字幕无码人妻少妇免费 | 在线观看国产午夜福利片 | 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲色偷偷男人的天堂 | 国产亚洲精品久久久久久国模美 | 四十如虎的丰满熟妇啪啪 | 色欲综合久久中文字幕网 | 日韩亚洲欧美中文高清在线 | 亚洲精品一区二区三区大桥未久 | 久久国产精品二国产精品 | 欧洲精品码一区二区三区免费看 | 精品无码av一区二区三区 | 国产激情无码一区二区app | 天天拍夜夜添久久精品大 | 久久亚洲精品中文字幕无男同 | 国产偷抇久久精品a片69 | 国产美女极度色诱视频www | 性欧美牲交xxxxx视频 | 美女张开腿让人桶 | 亚洲国产精品久久久天堂 | 欧美性猛交xxxx富婆 | 日日摸夜夜摸狠狠摸婷婷 | 曰韩无码二三区中文字幕 | 人人妻人人澡人人爽欧美精品 | 日产国产精品亚洲系列 | 国产精品久久久久无码av色戒 | 亚洲欧美日韩国产精品一区二区 | 亚洲精品一区二区三区婷婷月 | 少妇性l交大片 | 国产免费无码一区二区视频 | 欧美黑人巨大xxxxx | 老子影院午夜伦不卡 | 乌克兰少妇性做爰 | 久久久www成人免费毛片 | 日韩精品无码免费一区二区三区 | 精品国精品国产自在久国产87 | 奇米影视7777久久精品人人爽 | 精品国产精品久久一区免费式 | 欧美喷潮久久久xxxxx | 日韩精品无码免费一区二区三区 | 亚洲成在人网站无码天堂 | 99精品久久毛片a片 | 亚洲综合无码一区二区三区 | 大肉大捧一进一出视频出来呀 | 天天av天天av天天透 | 国产成人无码一二三区视频 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 在线天堂新版最新版在线8 | 亚洲va中文字幕无码久久不卡 | 人妻少妇精品视频专区 | 国内精品人妻无码久久久影院蜜桃 | 国产精品久久国产三级国 | 日日噜噜噜噜夜夜爽亚洲精品 | 高清无码午夜福利视频 | 国产精品亚洲一区二区三区喷水 | av香港经典三级级 在线 | 国产精品办公室沙发 | 亚洲自偷自拍另类第1页 | 久青草影院在线观看国产 | 亚洲小说图区综合在线 | aⅴ在线视频男人的天堂 | 伊人久久大香线蕉av一区二区 | 欧美成人午夜精品久久久 | 人妻有码中文字幕在线 | 国精产品一区二区三区 | 精品一区二区三区无码免费视频 | 欧美老熟妇乱xxxxx | 国产精品高潮呻吟av久久 | 欧美激情一区二区三区成人 | 丰满肥臀大屁股熟妇激情视频 | 欧美日韩一区二区三区自拍 | 一本精品99久久精品77 | 亚洲色欲色欲天天天www | 中文精品久久久久人妻不卡 | 亚洲成av人影院在线观看 | 亚洲国产精华液网站w | 国产超级va在线观看视频 | 日本精品少妇一区二区三区 | 玩弄人妻少妇500系列视频 | 国产99久久精品一区二区 | 午夜精品久久久久久久久 | 精品无码一区二区三区的天堂 | 国产又粗又硬又大爽黄老大爷视 | 97精品人妻一区二区三区香蕉 | 黑人玩弄人妻中文在线 | 美女黄网站人色视频免费国产 | 久久www免费人成人片 | 97夜夜澡人人双人人人喊 | 色婷婷av一区二区三区之红樱桃 | 国产网红无码精品视频 | 天天av天天av天天透 | 荡女精品导航 | 成人三级无码视频在线观看 | 漂亮人妻洗澡被公强 日日躁 | 激情五月综合色婷婷一区二区 | 国产成人久久精品流白浆 | 无码吃奶揉捏奶头高潮视频 | 国产午夜视频在线观看 | 高潮毛片无遮挡高清免费视频 | 色一情一乱一伦 | 麻豆蜜桃av蜜臀av色欲av | 日韩欧美中文字幕在线三区 | 亚洲熟妇色xxxxx欧美老妇 | 久久亚洲中文字幕无码 | 在线播放亚洲第一字幕 | 秋霞成人午夜鲁丝一区二区三区 | 国产精品嫩草久久久久 | 玩弄人妻少妇500系列视频 | 一本色道婷婷久久欧美 | 久久亚洲精品中文字幕无男同 | 99久久精品无码一区二区毛片 | 欧美人与动性行为视频 | 97se亚洲精品一区 | 久久zyz资源站无码中文动漫 | 午夜成人1000部免费视频 | 日本一卡2卡3卡四卡精品网站 | 欧美xxxx黑人又粗又长 | 日本大香伊一区二区三区 | 欧美人与善在线com | 美女黄网站人色视频免费国产 | 宝宝好涨水快流出来免费视频 | 亚洲日韩av片在线观看 | 国产免费久久精品国产传媒 | 男人扒开女人内裤强吻桶进去 | 久热国产vs视频在线观看 | 成人无码视频在线观看网站 | 免费男性肉肉影院 | 日本熟妇人妻xxxxx人hd | 99久久人妻精品免费一区 | 亚洲小说图区综合在线 | 性欧美大战久久久久久久 | 日韩精品a片一区二区三区妖精 | 少妇高潮一区二区三区99 | 国产99久久精品一区二区 | 国产口爆吞精在线视频 | 国产又粗又硬又大爽黄老大爷视 | 老熟妇仑乱视频一区二区 | 亚洲中文无码av永久不收费 | 老熟女重囗味hdxx69 | 免费看男女做好爽好硬视频 | 无码帝国www无码专区色综合 | 中文字幕乱码人妻无码久久 | 国产suv精品一区二区五 | 18精品久久久无码午夜福利 | 亚洲第一无码av无码专区 | 2020久久超碰国产精品最新 | 国产欧美熟妇另类久久久 | 中文字幕乱码人妻二区三区 | 欧美日韩综合一区二区三区 | 欧美黑人乱大交 | 毛片内射-百度 | 妺妺窝人体色www在线小说 | 久久久久se色偷偷亚洲精品av | 麻豆蜜桃av蜜臀av色欲av |