日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux套接字聊天

發布時間:2025/4/14 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux套接字聊天 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Linux套接字

套接字是一種通信機制,憑借這種機制,客戶/服務器系統的開發工作既可以在本地單機上進行,也可以跨網絡進行。
套接字的特性有三個屬性確定,它們是:域(domain),類型(type),和協議(protocol)。套接字還用地址作為它的名字。地址的格式隨域(又被稱為協議族,protocol family)的不同而不同。每個協議族又可以使用一個或多個地址族定義地址格式。
1.套接字的域
域指定套接字通信中使用的網絡介質。最常見的套接字域是AF_INET,它是指Internet網絡,許多Linux局域網使用的都是該網絡,當然,因特網自身用的也是它。其底層的協議——網際協議(IP)只有一個地址族,它使用一種特定的方式來指定網絡中的計算機,即IP地址。
在計算機系統內部,端口通過分配一個唯一的16位的整數來表示,在系統外部,則需要通過IP地址和端口號的組合來確定。
2.套接字類型
流套接字(在某些方面類似域標準的輸入/輸出流)提供的是一個有序,可靠,雙向字節流的連接。
流套接字由類型SOCK_STREAM指定,它們是在AF_INET域中通過TCP/IP連接實現的。他們也是AF_UNIX域中常見的套接字類型。
數據包套接字
與流套接字相反,由類型SOCK_DGRAM指定的數據包套接字不建立和維持一個連接。它對可以發送的數據包的長度有限制。數據報作為一個單獨的網絡消息被傳輸,它可能會丟失,復制或亂序到達。
數據報套接字實在AF_INET域中通過UDP/IP連接實現,它提供的是一種無需的不可靠服務。
3.套接字協議
只要底層的傳輸機制允許不止一個協議來提供要求的套接字類型,我們就可以為套接字選擇一個特定的協議。


創建套接字
socket系統調用創建一個套接字并返回一個描述符,該描述符可以用來訪問該套接字。
#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain , int type , int protocol);
創建的套接字是一條通信線路的一個端點。domain參數指定協議族,type參數指定這個套接字的通信類型,protocol參數指定使用的協議。
domain參數可以指定的協議族如下
域 說明
AF_UNIX ?UNIX域協議(文件系統套接字)
AF_INET ?ARPA因特網協議(UNIX網絡套接字)
AF_ISO ?ISO標準協議
AF_NS ?施樂(XEROX)網絡系統協議
AF_IPX ?NOVELL IPX協議
AF_APPLETALK
Appletalk DDS
最常見的套接字域是AF_UNIX和AF_INET,前者用于通過Unix和Linux文件系統實現的本地套接字,后者用于Unix網絡套接字。AF_INET套接字可以用于通過包括因特網在內的TCP/IP網絡進行通信的程序。微軟Windows系統的winsock接口也提供了對這個套接字域的訪問功能。
socket函數的參數type指定用于新套接字的通信特性。它的取值包括SOCK_STREAM和SOCK_DGRAM。
SOCK_STREAM是一個有序、可靠、面向連接的雙字節流。通過TCP連接來實現。
SOCK_DGRAM是數據包服務,我們可以用它來發送最大長度固定的消息。但消息是否會被正確傳遞或消息是否不會亂序到達沒有保證。
套接字地址結構
結構struct sockaddr_un 定義了一種通用的套接字地址,它的類型是:
struct sockaddr_un
{
? ? sa_family_t sun_family; ? ? ? /*AF_UNIX*/
? ? char ? ? ? ? ? ? ?sun_path; ? ? ? ? /*pathname*/
};
這是一種通用的定義,一般都不用。TCP/IP使用的是自己的結構體struct sockaddr_in,格式如下:
struct sockaddr_in
{
? ? short int sin_family; ? ? ?//地址類型,一般為AF_INET
? ? unsigned short int sin_port; ? ? ? ?//端口號
? ? struct in_addr sin_addr; ? ? ? ?//IP地址
};
這里的struct in_addr的定義如下:
struct in_addr
{
? ? unsigned long int ?s_addr;
};
結構體sockaddr和sockaddr_in的長度都是16字節。一般在編TCP/IP程序時,一般使用結構體sockaddr_in來設置地址,然后在需要的時候,通過強制類型轉換成sockaddr類型。
建立連接
函數connect用來在一個指定的套接字上創建一個連接,函數原型:
[cpp] view plain copy print?
int connect(int socket, const struct sockaddr *address, size_t address_len); ?
參數sockfd是一個由函數socket創建的套接字;
參數address是一個地址結構,需要連接的地址;
參數address_len為參數addr_addr的長度。
函數執行成功返回0,有錯誤發生則返回-1。
如果套接字類型是TCP,則該函數用于向服務器發出連接請求,服務器的IP地址和端口號由參數serv_addr指定;如果套接字類型是UDP,則該函數并不建立真正的連接,它只是告訴內核與該套接字進行通信的目的地址(由第二個參數指定),只有該目的地址發來的數據才會被該socket接收。
通常一個面向連接的套接字只能調用一次connect函數;而對于無連接的套接字則可以多次調用connect函數以改變與目的地址的綁定。
在套接字上監聽
函數listen把套接字轉化為被動監聽,函數原型:
int listen(int s, int backlog);
參數s指定了一個套接字;
參數backlog指定了該連接隊列的最大長度,如果已達到最大,則之后的連接請求將被服務器拒絕。
函數執行成功趕回0,有錯誤發生則返回-1。
由函數socket創建的套接字是主動套接字,這種套接字可以用來主動請求連接到某個服務器上。(通過connect()函數)。
作為服務器端的程序,通常在某個端口上監聽等待來自客戶端的連接請求。在服務器端,一般是先調用函數socket創建一個主動套接字,然后調用函數bind將該套接字綁定到某個端口上,接著再調用函數listen將該套接字轉化為監聽套接字,等待來自于客戶端的連接請求。
函數listen只是將套接字設置為傾聽模式以等待連接請求,它并不能接收連接請求,真正的接收客戶端連接請求的是accept()函數。
接收連接
函數accept用來接收一個連接請求,函數原型:
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
參數s是由socket創建,經函數bind綁定到本地某一端口上,然后通過函數listen轉化而來的監聽套接字;
參數addr用來保存發起連接請求的主機的地址和端口;
參數addrlen是addr所指向的結構體的大小。
函數執行成功返回一個新的代表客戶端的套接字,出錯則返回-1。
只能對面向連接的套接字使用accept函數。accept執行成功時,將創建一個新的套接字,并且這個新的套接字分配一個套接字描述符,并返回這個新的套接字描述符。這個新的套接字描述符與打開文件返回的文件描述符類似,進程可以利用這個新的套接字描述符與客戶端交換數據,參數s所指定的套接字繼續等待客戶端的連接請求。


[cpp] view plain copy print?
/* ?Make the necessary includes and set up the variables. ?*/ ?
??
#include <sys/types.h> ?
#include <sys/socket.h> ?
#include <stdio.h> ?
#include <sys/un.h> ?
#include <unistd.h> ?
#include <stdlib.h> ?
??
int main() ?
{ ?
? ? int sockfd; ?
? ? int len; ?
? ? struct sockaddr_un address; ?
? ? int result; ?
? ? char ch = 'A'; ?
??
/* ?Create a socket for the client. ?*/ ?
??
? ? sockfd = socket(AF_UNIX, SOCK_STREAM, 0); ?
??
/* ?Name the socket, as agreed with the server. ?*/ ?
??
? ? address.sun_family = AF_UNIX; ?
? ? strcpy(address.sun_path, "server_socket"); ?
? ? len = sizeof(address); ?
??
/* ?Now connect our socket to the server's socket. ?*/ ?
??
? ? result = connect(sockfd, (struct sockaddr *)&address, len); ?
??
? ? if(result == -1) { ?
? ? ? ? perror("oops: client1"); ?
? ? ? ? exit(1); ?
? ? } ?
??
/* ?We can now read/write via sockfd. ?*/ ?
??
? ? write(sockfd, &ch, 1); ?
? ? read(sockfd, &ch, 1); ?
? ? printf("char from server = %c\n", ch); ?
? ? close(sockfd); ?
? ? exit(0); ?
} ?


[cpp] view plain copy print?
/* ?Make the necessary includes and set up the variables. ?*/ ?
??
#include <sys/types.h> ?
#include <sys/socket.h> ?
#include <stdio.h> ?
#include <sys/un.h> ?
#include <unistd.h> ?
#include <stdlib.h> ?
??
int main() ?
{ ?
? ? int server_sockfd, client_sockfd; ?
? ? int server_len, client_len; ?
? ? struct sockaddr_un server_address; ?
? ? struct sockaddr_un client_address; ?
??
/* ?Remove any old socket and create an unnamed socket for the server. ?*/ ?
??
? ? unlink("server_socket"); ?
? ? server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0); ?
??
/* ?Name the socket. ?*/ ?
??
? ? server_address.sun_family = AF_UNIX; ?
? ? strcpy(server_address.sun_path, "server_socket"); ?
? ? server_len = sizeof(server_address); ?
? ? bind(server_sockfd, (struct sockaddr *)&server_address, server_len); ?
??
/* ?Create a connection queue and wait for clients. ?*/ ?
??
? ? listen(server_sockfd, 5); ?
? ? while(1) { ?
? ? ? ? char ch; ?
??
? ? ? ? printf("server waiting\n"); ?
??
/* ?Accept a connection. ?*/ ?
??
? ? ? ? client_len = sizeof(client_address); ?
? ? ? ? client_sockfd = accept(server_sockfd, ??
? ? ? ? ? ? (struct sockaddr *)&client_address, &client_len); ?
??
/* ?We can now read/write to client on client_sockfd. ?*/ ?
??
? ? ? ? read(client_sockfd, &ch, 1); ?
? ? ? ? ch++; ?
? ? ? ? write(client_sockfd, &ch, 1); ?
? ? ? ? close(client_sockfd); ?
? ? } ?
}?
========

Linux 下基于socket的簡單網絡聊天室(服務器與客戶端)

本程序分為服務端與客戶端,服務器建立一個共享內存區,用于存貯各個客戶端發送過來的消息,服務器接收一個客戶端登陸后,即開啟一個子進程,原父進程返回等待新客戶的登陸,子進程用于接收客戶的消息,并把共享內存里面的全部的內容發送給客戶端。為了便于處理數據的方便,在處理客戶消息的子進程中再創建一個子進程,一個用于接收子進程消息,存于共享內存區;另一個子進程用于發送共享內存給客戶端。
?
客戶端接收到共享內存的內容后,根據實際情況顯示共享內存里面的內容。后登陸的用戶可以看到前面用戶的聊天內容。
本設計鍛煉了linux中socket的基本應用,服務端建立套接字的大致步驟:
1,建立socket。
2,bind 綁定特定的端口。
3,listen 監聽特定的端口。
4,accept,當有客戶端連接服務器端口時,accept接收信息,并返回新的套接字描述符,提供給操作
5,根據實際需求,write,read,send,recv等操作
6,關閉套接字。
客戶端大致步驟:
1,創建socket.
2,根據服務器地址,connect連接到特定服務器。
3,write,read等讀寫操作。
4,關閉套接字。
?
在程序調試過程中,要特別注意清空常用的載體。留意sizeof和strlen的區別。
留意各進程之間的關系的梳理,各循環的起始條件,運行情況。
?
?
服務器:server.c
#include <sys/types.h>
#include <sys/socket.h> ? ? ? ? ? ? ? ? ? ? ? ? // 包含套接字函數庫
#include <stdio.h>
#include <netinet/in.h> ? ? ? ? ? ? ? ? ? ? ? ? // 包含AF_INET相關結構
#include <arpa/inet.h> ? ? ? ? ? ? ? ? ? ? ?// 包含AF_INET相關操作的函數
#include <unistd.h>
#include<string.h>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/shm.h>


#define PORT ? ?8888;


#define MYKEY ? 12345
#define SIZE ? ?10240


int main()
{ ?
? ? int shmid;
? ? char *shmaddr; ? ? ? ? ? ? ? ? ? ? ? //定義子進程共用的共享內存?
? ? shmid = shmget(MYKEY, SIZE, IPC_CREAT | 0600); ?
? ? shmaddr= (char *) shmat(shmid, 0, 0);
? ?
? ? if(shmid==-1)
? ? {
? ? ? ? printf("shmid error\n");
? ? }
? ? memset(shmaddr,0,SIZE);
? ?
? ? int i=0;
? ? char buf[100];
? ? memset(buf,0,100);
? ?
? ?
? ? int server_sockfd,client_sockfd; ??
? ? int server_len,client_len;
? ?
? ? struct sockaddr_in server_sockaddr,client_sockaddr;
? ?
? ?
? ? server_sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定義套接字類型
? ?
? ? server_sockaddr.sin_family=AF_INET;
? ? server_sockaddr.sin_port=PORT;
? ? server_sockaddr.sin_addr.s_addr=INADDR_ANY;
? ?
? ? server_len=sizeof(server_sockaddr);
? ?
? ? //允許重復使用本地地址和套接字綁定
? ? int j=1;
? ? setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));
? ?
? ? //綁定端口
? ? if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,server_len)==-1)
? ? {
? ? ? ? perror("bind:");
? ? ? ? exit(1); ? ? ??
? ? }
? ?
? ?
? ? if(listen(server_sockfd,5)==-1)
? ? {
? ? ? ? perror("listen:");
? ? ? ? exit(1); ??
? ? }
? ? printf("Listening...\n");
? ?
? ? client_len=sizeof(client_sockaddr);
? ?
? ? pid_t ppid,pid;
??
? ?while(1)
? ?{ ?
? ? if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_sockaddr,&client_len))==-1)
? ? ? ? {
? ? ? ? ? ? ?perror("accept error:");
? ? ? ? ? ? ?exit(1);
? ? ? ? }
? ?
? ? printf("%s登錄服務器\n",inet_ntoa(client_sockaddr.sin_addr));
? ?
? ? ppid=fork();
? ?
? ? if(ppid==-1)
? ? {
? ? ? ? printf("fork 1 failed:");
? ? }
? ?
? ? if(ppid==0) ? ? ? ? ? ? ? ? ?//子進程用于接收客戶端信息并發送
? ? {
? ? ? ? pid=fork();
? ? ? ? if(pid==-1)
? ? ? ? {
? ? ? ? ? ? printf("fork 2 failed:");
? ? ? ? ? ? exit(1);
? ? ? ? }
? ??
? ? ?int recvbytes; ?
? ? ? ? ?
? ? ? ? if(pid==0) ? ? ? ? ? ? ?//子子進程用于接收消息
? ? ? ? { ?
? ? ? ? ? ? while(1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?if((recvbytes=recv(client_sockfd,buf,100,0))==-1)
? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? perror("read client_sockfd failed:");
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?// printf("recvbytes=%d\n",recvbytes);
? ? ? ? ? ? ? ? usleep(10000);
? ? ? ? ? ? ? ?printf("client send buf=%s\n",buf);
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? for(i=0;i<1000;i++)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? if(*(shmaddr+100*i)==0)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? strcpy(shmaddr+100*i,buf); ?
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
? ? ? ? ? ? }
? ? ? ? }
? ? ? ?
? ? ? ? if(pid>0) ? ? ? ? ? ? ? //子進程用于發送消息?
? ? ? ? {
? ? ? ? ? ?while(1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if(*(shmaddr+i*100)!=0)
? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ?// strcpy(&buf,shmaddr+100*i);
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? // ?buf++;
? ? ? ? ? ? ? ? ? ? write(client_sockfd,shmaddr,SIZE);
? ? ? ? ? ? ? ? ? ?// send(client_sockfd,buf,strlen(buf),0);
? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?// ? printf("the server is send buf=%c",buf);
? ? ? ? ? ? ? ? ? // ?printf("send client :%s\n",(shmaddr+i*100)) ;
? ? ? ? ? ? ? ? ? ? i++;
? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ?
? ? ? ? } ? ?
? ? ??
? ? }
? ?
? ?
? ? if(ppid>0) ? ? ? ? ? ? ?//總父進程返回等待接收消息
? ? {
? ? ? ? close(client_sockfd);
? ? }
? ? ? ?
? ??
? ? }


}
?
客戶端:client.c
#include <sys/types.h>
#include <sys/socket.h> ? ? ? ? ? ? ? ? ? ? ? ? // 包含套接字函數庫
#include <stdio.h>
#include <netinet/in.h> ? ? ? ? ? ? ? ? ? ? ? ? // 包含AF_INET相關結構
#include <arpa/inet.h> ? ? ? ? ? ? ? ? ? ? ? ? ?// 包含AF_INET相關操作的函數
#include <unistd.h>
#include<string.h>
#include<time.h>


#define ?PORT 8888
#define ?IP_ADDR "192.168.110.185"


#define SIZE 10240


int main()
{ ?
? ? ?
? ? struct tm *timeptr;
? ? time_t timeval;
? ? char tm[50];
? ? //(void)time(&timeval);
? ?
? ? //printf("the date is %s\n",ctime(&timeval));
? ?// printf("The time is %s\n",tm);


? ? int sockfd; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 用于保存客戶套接字標識符
? ? int len; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 用于客戶消息長度
? ? struct sockaddr_in address; ? ? ? ? ? ? ? ? // 定義客戶套接字地址


? ? int result;
? ?


? ? sockfd = socket(AF_INET,SOCK_STREAM, 0); ? ?// 定義套接字類型
? ? address.sin_family = AF_INET; ? ? ? ? ? ? ? // 定義套接字地址中的域
? ?
? ? address.sin_addr.s_addr = inet_addr(IP_ADDR); ? ? ? ? ? ? ? ? ? ? ? ? ? // 定義套接字地址
? ?
? ? address.sin_port = htons(PORT); ? ? ? ? ? ? ? ? // 定義套接字端口
? ? char buf[100]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 定義要傳送的消息
? ? memset(buf,0,100);
? ? char str[90]; ? ? ? ? ? ? ? ? ? ? ? //存貯輸入的語句
? ?
? ? char shmaddr[SIZE]; ? ? ? ? ? ? ? ? ? ?//接受服務器發送的全部聊天數據?
? ? int i=0;
? ?
? ? char myname[100];
? ? char say[10]={"說:"};
? ? printf("歡迎來到聊天室,請輸入你的姓名:\n");
? ? scanf("%s",myname);
? ?
? ?
??
? ?len = sizeof(address);
? ?result = connect(sockfd, (struct sockaddr *) &address, len); // 請求連接


? ?if (result == -1) ?
? ? {
? ? ? perror("Connect failed");
? ? ? return 1;
? ? }
? ? printf("%s成功登錄服務器:\n",myname);
? ?


? ? pid_t pid;
? ?
? ? pid=fork();
? ? if(pid==-1)
? ? {
? ? ? ? printf("fork failed");
? ? }
? ?
? ? int sendbytes=0;
?
? ? if(pid==0) ? ? ? ? ? ? ?//子進程用于發送數據
? ? {
? ? ? ?while(1)
? ? ? ? {
? ? ? ? ? ? ? ? printf("請輸入語句:\n");
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? scanf("%s",str);
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? (void)time(&timeval);
? ? ? ? ? ? ? ? strcpy(tm,ctime(&timeval));
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? strcpy(buf,myname); ? ? ? ? ? ? //姓名傳入buf中
? ? ? ? ? ? ? ? strcat(buf,tm); ? ? ? ? ? ? ? ? //時間傳入buf中
? ? ? ? ? ? ? ? strcat(buf,say); ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? strcat(buf,str); ? ? ? ? ? ? ? ?//語句傳入bufz中
? ? ? ? ? ? ??
? ? ? ? ? ? ? ? //read(0,buf,strlen(buf));
? ? ? ? ? ? ??
? ? ? ? ? ? ? ? // send(sockfd,buf,strlen(buf),0);
? ? ? ? ? ? ? ? // getchar();
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ?if((sendbytes=write(sockfd, buf, 100))==-1)
? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? perror("send to server failed:");
? ? ? ? ? ? ? ? ?} ?// 向服務器傳送消息
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? // printf("sendbytes=%d\n",sendbytes);
? ? ? ? ? ? ? ?// ?printf("buf=%s\n",buf);
? ? ? ? ? ? ? ?// ? printf("input buf=%s\n",buf); ??
? ? ? ? ? ? ? ? ?usleep(1000);
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? memset(buf,0,100);
? ? ? ? ? ? ? ? memset(tm,0,50);
? ? ? ? } ? ? ?
? ? }
? ?
? ? if(pid>0) ? ? ? ? ? ? ? //父進程用于接受消息并讀取
? ? {
? ? ? ? while(1)
? ? ? ? {
? ? ? ? ? ? read(sockfd,shmaddr,SIZE);
? ? ? ? ? // printf("server send shmaddr=%s\n",shmaddr);
? ? ? ? ? ?
? ? ? ? ? ? if(*(shmaddr+i*100)!=0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? printf("%s\n",(shmaddr+i*100)) ;
? ? ? ? ? ? ? ? i++;
? ? ? ? ? ??
? ? ? ? ? ? }
? ? ? ? ? ?
? ? ? ? ? ? usleep(1000);
? ? ? ? }
? ?
? ? ? ?
? ? }
? ?
??
? ? close(sockfd);
? ? return 0;




}
========

linux網絡編程:用C語言實現的聊天程序(異步通信)


本片文章,在上一篇:linux網絡編程:用C語言實現的聊天程序(同步通信) 的基礎上,增加了IO復用的功能,實現了聊天程序的異步通訊!


1、使用IO復用可以在等待的時候加入了超時的時間,如果等待的時間沒有達到超時時間,那么該情況與阻塞的情況一致。而當超時的時間到達時,仍沒有數據接收到,系統回返回0,不再等待。select函數就實現了這個功能。


2、select函數原型
int select (int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval * timeout);
a)返回值
>0:就緒的描述符  
-1:出錯  
0 :超時     
struct timeval{  
long tv_sec; // seconds  
long tv_usec; // microseconds
}
b)具體解釋select的參數
int maxfdp是一個整數值,是指集合中所有文件描述符的范圍,即所有文件描述符的最大值加1;
fd_set*readfds 文件描述符集合內,是否有數據可讀;
fd_set*writefds 文件描述符集合內,是否有數據可寫;
fd_set *errorfds 文件描述符集合內,是否有文件發生錯誤;
struct timeval *timeout是select的超時時間,它可以使select處于三種狀態,第一,若將NULL以形參傳入,就是將select置于阻塞狀態;第二,若將時間值設為0秒0毫秒,就變成一個純粹的非阻塞函數,不管文件描述符是否有變化,都立刻返回繼續執行,文件無變化返回0,有變化返回一個正值;第三,timeout的值大于0,這就是等待的超時時間,即select在timeout時間內阻塞。
c)4個宏可以操作文件描述符的集合
void FD_ZERO (fd_set *fdset); // 初始化文件描述集合  
void FD_SET (int fd, fd_set *fdset); // 將描述符加入到集合中  
void FD_CLR (int fd, fd_set *fdset); // 將描述符中集合中刪除  
int FD_ISSET (int fd, fd_set *fdset); // 檢查描述符集合中指定的文件描述符是否可讀寫


3、客戶端源代碼:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h>


#define BUFLEN 1024


int main(int argc, char **argv)
{
? ? int sockfd;
? ? struct sockaddr_in s_addr;
? ? socklen_t len;
? ? unsigned int port;
? ? char buf[BUFLEN];
? ? fd_set rfds;
? ? struct timeval tv;
? ? int retval, maxfd; ? ?
? ??
? ? /*建立socket*/
? ? if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
? ? ? ? perror("socket");
? ? ? ? exit(errno);
? ? }else
? ? ? ? printf("socket create success!\n");


? ? /*設置服務器端口*/ ? ?
? ? if(argv[2])
? ? ? ? port = atoi(argv[2]);
? ? else
? ? ? ? port = 4567;
? ? /*設置服務器ip*/
? ? bzero(&s_addr, sizeof(s_addr));
? ? s_addr.sin_family = AF_INET;
? ? s_addr.sin_port = htons(port);
? ? if (inet_aton(argv[1], (struct in_addr *)&s_addr.sin_addr.s_addr) == 0) {
? ? ? ? perror(argv[1]);
? ? ? ? exit(errno);
? ? }
? ? /*開始連接服務器*/ ? ?
? ? if(connect(sockfd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr)) == -1){
? ? ? ? perror("connect");
? ? ? ? exit(errno);
? ? }else
? ? ? ? printf("conncet success!\n");
? ??
? ? while(1){
? ? ? ? /*把可讀文件描述符的集合清空*/
? ? ? ? FD_ZERO(&rfds);
? ? ? ? /*把標準輸入的文件描述符加入到集合中*/
? ? ? ? FD_SET(0, &rfds);
? ? ? ? maxfd = 0;
? ? ? ? /*把當前連接的文件描述符加入到集合中*/
? ? ? ? FD_SET(sockfd, &rfds);
? ? ? ? /*找出文件描述符集合中最大的文件描述符*/ ? ?
? ? ? ? if(maxfd < sockfd)
? ? ? ? ? ? maxfd = sockfd;
? ? ? ? /*設置超時時間*/
? ? ? ? tv.tv_sec = 5;
? ? ? ? tv.tv_usec = 0;
? ? ? ? /*等待聊天*/
? ? ? ? retval = select(maxfd+1, &rfds, NULL, NULL, &tv);
? ? ? ? if(retval == -1){
? ? ? ? ? ? printf("select出錯,客戶端程序退出\n");
? ? ? ? ? ? break;
? ? ? ? }else if(retval == 0){
? ? ? ? ? ? printf("客戶端沒有任何輸入信息,并且服務器也沒有信息到來,waiting...\n");
? ? ? ? ? ? continue;
? ? ? ? }else{
? ? ? ? ? ? /*服務器發來了消息*/
? ? ? ? ? ? if(FD_ISSET(sockfd,&rfds)){
? ? ? ? ? ? ? ? /******接收消息*******/
? ? ? ? ? ? ? ? bzero(buf,BUFLEN);
? ? ? ? ? ? ? ? len = recv(sockfd,buf,BUFLEN,0);
? ? ? ? ? ? ? ? if(len > 0)
? ? ? ? ? ? ? ? ? ? printf("服務器發來的消息是:%s,共有字節數是: %d\n",buf,len);
? ? ? ? ? ? ? ? else{
? ? ? ? ? ? ? ? ? ? if(len < 0 )
? ? ? ? ? ? ? ? ? ? ? ? printf("接受消息失敗!\n");
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? printf("服務器退出了,聊天終止!\n");
? ? ? ? ? ? ? ? break; ? ?
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? /*用戶輸入信息了,開始處理信息并發送*/
? ? ? ? ? ? if(FD_ISSET(0, &rfds)){
? ? ? ? ? ? _retry: ? ?
? ? ? ? ? ? ? ? /******發送消息*******/ ? ?
? ? ? ? ? ? ? ? bzero(buf,BUFLEN);
? ? ? ? ? ? ? ? /*fgets函數:從流中讀取BUFLEN-1個字符*/
? ? ? ? ? ? ? ? fgets(buf,BUFLEN,stdin);
? ? ? ? ? ? ? ? /*打印發送的消息*/
? ? ? ? ? ? ? ? //fputs(buf,stdout);
? ? ? ? ? ? ? ? if(!strncasecmp(buf,"quit",4)){
? ? ? ? ? ? ? ? ? ? printf("client 請求終止聊天!\n");
? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? /*如果輸入的字符串只有"\n",即回車,那么請重新輸入*/
? ? ? ? ? ? ? ? if(!strncmp(buf,"\n",1)){
? ? ? ? ? ? ? ? ? ? printf("輸入的字符只有回車,這個是不正確的!!!\n");
? ? ? ? ? ? ? ? ? ? goto _retry;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? /*如果buf中含有'\n',那么要用strlen(buf)-1,去掉'\n'*/ ? ?
? ? ? ? ? ? ? ? if(strchr(buf,'\n'))
? ? ? ? ? ? ? ? ? ? len = send(sockfd,buf,strlen(buf)-1,0);
? ? ? ? ? ? ? ? /*如果buf中沒有'\n',則用buf的真正長度strlen(buf)*/ ? ?
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? len = send(sockfd,buf,strlen(buf),0);
? ? ? ? ? ? ? ? if(len > 0)
? ? ? ? ? ? ? ? ? ? printf("\t消息發送成功,本次共發送的字節數是:%d\n",len); ? ? ? ? ? ?
? ? ? ? ? ? ? ? else{
? ? ? ? ? ? ? ? ? ? printf("消息發送失敗!\n");
? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ?
? ? ? ? ? ? ? ? } ? ?
? ? ? ? ? ? }
? ? ? ? }
? ??
? ? }
? ? /*關閉連接*/
? ? close(sockfd);


? ? return 0;
}


4、服務器源代碼:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/time.h>


#define BUFLEN 1024


int main(int argc, char **argv)
{
? ? int sockfd, newfd;
? ? struct sockaddr_in s_addr, c_addr;
? ? char buf[BUFLEN];
? ? socklen_t len;
? ? unsigned int port, listnum;
? ? fd_set rfds;
? ? struct timeval tv; ? ?
? ? int retval,maxfd;
? ??
? ? /*建立socket*/
? ? if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
? ? ? ? perror("socket");
? ? ? ? exit(errno);
? ? }else
? ? ? ? printf("socket create success!\n");
? ? /*設置服務器端口*/ ? ?
? ? if(argv[2])
? ? ? ? port = atoi(argv[2]);
? ? else
? ? ? ? port = 4567;
? ? /*設置偵聽隊列長度*/
? ? if(argv[3])
? ? ? ? listnum = atoi(argv[3]);
? ? else
? ? ? ? listnum = 3;
? ? /*設置服務器ip*/
? ? bzero(&s_addr, sizeof(s_addr));
? ? s_addr.sin_family = AF_INET;
? ? s_addr.sin_port = htons(port);
? ? if(argv[1])
? ? ? ? s_addr.sin_addr.s_addr = inet_addr(argv[1]);
? ? else
? ? ? ? s_addr.sin_addr.s_addr = INADDR_ANY;
? ? /*把地址和端口幫定到套接字上*/
? ? if((bind(sockfd, (struct sockaddr*) &s_addr,sizeof(struct sockaddr))) == -1){
? ? ? ? perror("bind");
? ? ? ? exit(errno);
? ? }else
? ? ? ? printf("bind success!\n");
? ? /*偵聽本地端口*/
? ? if(listen(sockfd,listnum) == -1){
? ? ? ? perror("listen");
? ? ? ? exit(errno); ? ?
? ? }else
? ? ? ? printf("the server is listening!\n");
? ? while(1){
? ? ? ? printf("*****************聊天開始***************\n");
? ? ? ? len = sizeof(struct sockaddr);
? ? ? ? if((newfd = accept(sockfd,(struct sockaddr*) &c_addr, &len)) == -1){
? ? ? ? ? ? perror("accept"); ? ? ? ?
? ? ? ? ? ? exit(errno);
? ? ? ? }else
? ? ? ? ? ? printf("正在與您聊天的客戶端是:%s: %d\n",inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port));
? ? ? ? while(1){
? ? ? ? ? ? /*把可讀文件描述符的集合清空*/
? ? ? ? ? ? FD_ZERO(&rfds);
? ? ? ? ? ? /*把標準輸入的文件描述符加入到集合中*/
? ? ? ? ? ? FD_SET(0, &rfds);
? ? ? ? ? ? maxfd = 0;
? ? ? ? ? ? /*把當前連接的文件描述符加入到集合中*/
? ? ? ? ? ? FD_SET(newfd, &rfds);
? ? ? ? ? ? /*找出文件描述符集合中最大的文件描述符*/ ? ?
? ? ? ? ? ? if(maxfd < newfd)
? ? ? ? ? ? ? ? maxfd = newfd;
? ? ? ? ? ? /*設置超時時間*/
? ? ? ? ? ? tv.tv_sec = 5;
? ? ? ? ? ? tv.tv_usec = 0;
? ? ? ? ? ? /*等待聊天*/
? ? ? ? ? ? retval = select(maxfd+1, &rfds, NULL, NULL, &tv);
? ? ? ? ? ? if(retval == -1){
? ? ? ? ? ? ? ? printf("select出錯,與該客戶端連接的程序將退出\n");
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }else if(retval == 0){
? ? ? ? ? ? ? ? printf("服務器沒有任何輸入信息,并且客戶端也沒有信息到來,waiting...\n");
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? /*用戶輸入信息了,開始處理信息并發送*/
? ? ? ? ? ? ? ? if(FD_ISSET(0, &rfds)){
? ? ? ? ? ? ? ? _retry:
? ? ? ? ? ? ? ? ? ? /******發送消息*******/
? ? ? ? ? ? ? ? ? ? bzero(buf,BUFLEN);
? ? ? ? ? ? ? ? ? ? /*fgets函數:從流中讀取BUFLEN-1個字符*/
? ? ? ? ? ? ? ? ? ? fgets(buf,BUFLEN,stdin);
? ? ? ? ? ? ? ? ? ? /*打印發送的消息*/
? ? ? ? ? ? ? ? ? ? //fputs(buf,stdout);
? ? ? ? ? ? ? ? ? ? if(!strncasecmp(buf,"quit",4)){
? ? ? ? ? ? ? ? ? ? ? ? printf("server 請求終止聊天!\n");
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? /*如果輸入的字符串只有"\n",即回車,那么請重新輸入*/
? ? ? ? ? ? ? ? ? ? if(!strncmp(buf,"\n",1)){
? ? ? ? ? ? ? ? ? ? ? ? printf("輸入的字符只有回車,這個是不正確的!!!\n");
? ? ? ? ? ? ? ? ? ? ? ? goto _retry;
? ? ? ? ? ? ? ? ? ? } ? ?
? ? ? ? ? ? ? ? ? ? /*如果buf中含有'\n',那么要用strlen(buf)-1,去掉'\n'*/ ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? if(strchr(buf,'\n'))
? ? ? ? ? ? ? ? ? ? ? ? len = send(newfd,buf,strlen(buf)-1,0);
? ? ? ? ? ? ? ? ? ? /*如果buf中沒有'\n',則用buf的真正長度strlen(buf)*/ ? ?
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? len = send(newfd,buf,strlen(buf),0);
? ? ? ? ? ? ? ? ? ? if(len > 0)
? ? ? ? ? ? ? ? ? ? ? ? printf("\t消息發送成功,本次共發送的字節數是:%d\n",len); ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? else{
? ? ? ? ? ? ? ? ? ? ? ? printf("消息發送失敗!\n");
? ? ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? /*客戶端發來了消息*/
? ? ? ? ? ? ? ? if(FD_ISSET(newfd, &rfds)){
? ? ? ? ? ? ? ? ? ? /******接收消息*******/
? ? ? ? ? ? ? ? ? ? bzero(buf,BUFLEN);
? ? ? ? ? ? ? ? ? ? len = recv(newfd,buf,BUFLEN,0);
? ? ? ? ? ? ? ? ? ? if(len > 0)
? ? ? ? ? ? ? ? ? ? ? ? printf("客戶端發來的信息是:%s,共有字節數是: %d\n",buf,len);
? ? ? ? ? ? ? ? ? ? else{
? ? ? ? ? ? ? ? ? ? ? ? if(len < 0 )
? ? ? ? ? ? ? ? ? ? ? ? ? ? printf("接受消息失敗!\n");
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? printf("客戶端退出了,聊天終止!\n");
? ? ? ? ? ? ? ? ? ? ? ? break; ? ?
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? /*關閉聊天的套接字*/
? ? ? ? close(newfd);
? ? ? ? /*是否退出服務器*/
? ? ? ? printf("服務器是否退出程序:y->是;n->否? ");
? ? ? ? bzero(buf, BUFLEN);
? ? ? ? fgets(buf,BUFLEN, stdin);
? ? ? ? if(!strncasecmp(buf,"y",1)){
? ? ? ? ? ? printf("server 退出!\n");
? ? ? ? ? ? break;
? ? ? ? }
? ? }
? ? /*關閉服務器的套接字*/
? ? close(sockfd);
? ? return 0;
}


5、編譯源代碼:
new@new-desktop:~/linux/c$ gcc -Wall async-server.c -o async-server
new@new-desktop:~/linux/c$ gcc -Wall async-client.c -o async-client


6、服務器運行:
new@new-desktop:~/linux/c$ ./async-server 127.0.0.1
socket create success!
bind success!
the server is listening!
*****************聊天開始***************
正在與您聊天的客戶端是:127.0.0.1: 37648
服務器沒有任何輸入信息,并且客戶端也沒有信息到來,waiting...
hello
消息發送成功,本次共發送的字節數是:5
服務器沒有任何輸入信息,并且客戶端也沒有信息到來,waiting...
客戶端發來的信息是:renwen,共有字節數是: 6


7、客戶端運行:
new@new-desktop:~/linux/c$ ./async-client 127.0.0.1?
socket create success!
conncet success!
客戶端沒有任何輸入信息,并且服務器也沒有信息到來,waiting...
服務器發來的消息是:hello,共有字節數是: 5
客戶端沒有任何輸入信息,并且服務器也沒有信息到來,waiting...
renwen
消息發送成功,本次共發送的字節數是:6
客戶端沒有任何輸入信息,并且服務器也沒有信息到來,waiting...
客戶端沒有任何輸入信息,并且服務器也沒有信息到來,waiting...
客戶端沒有任何輸入信息,并且服務器也沒有信息到來,waiting...


========

資源鏈接

http://www.codeceo.com/article/linux-chart.html
基于Linux的多功能聊天室

總結

以上是生活随笔為你收集整理的Linux套接字聊天的全部內容,希望文章能夠幫你解決所遇到的問題。

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

日韩丝袜在线观看 | 中文字幕大全 | 欧美伦理一区二区 | 久久国产成人午夜av影院宅 | 久久精选视频 | 91大神一区二区三区 | 韩日av在线 | 色com| 人人插人人舔 | 日韩一区正在播放 | 午夜免费在线观看 | 久久不卡国产精品一区二区 | 在线亚洲欧美日韩 | 国产成人福利在线 | www.天天色.com | 黄色一级网 | 亚洲激情婷婷 | 日韩 在线| 久久久久久久久久影院 | 国产一区国产二区在线观看 | 射九九| 国产一区二区在线观看视频 | 久久久www | 99在线观看免费视频精品观看 | 97人人澡人人爽人人模亚洲 | 午夜久久久影院 | 免费人成网ww44kk44 | 久久黄色免费视频 | 99久久精品国产系列 | 玖玖爱免费视频 | 欧美国产日韩一区二区三区 | 成人黄色免费在线观看 | 二区精品视频 | 久久久久久久久久久精 | 久久国产精品99精国产 | 色免费在线 | 久久久久免费电影 | 92av视频 | 99精品黄色片免费大全 | 天堂v中文| 婷婷五综合 | 黄色免费大片 | 97视频人人澡人人爽 | 久久国内精品99久久6app | 97成人在线免费视频 | 国产精品视频大全 | 国产精品18久久久久vr手机版特色 | 久久久久久久久久久久影院 | 色姑娘综合网 | 午夜的福利| 99在线看 | 国产精品一区二区果冻传媒 | 999男人的天堂 | 九九热视频在线播放 | 免费看黄色小说的网站 | 免费看污污视频的网站 | 日韩av影片在线观看 | 黄色三级网站在线观看 | 欧美一性一交一乱 | 国产字幕在线看 | 国内精品视频久久 | 亚洲精品九九 | 欧美一级黄色视屏 | 97狠狠操 | 亚洲女人天堂成人av在线 | 日韩最新av在线 | 99久热| 久久婷综合| 97精品国产97久久久久久春色 | 国产在线a| 四虎影视8848dvd | 四虎www com| 99热999 | 日韩精品免费一区二区在线观看 | 午夜三级在线 | 在线国产黄色 | 91完整版观看 | 99热这里只有精品国产首页 | 久久久久久久久久毛片 | 亚洲无人区小视频 | 99亚洲精品 | 激情欧美丁香 | 最近2019中文免费高清视频观看www99 | 久久久久久久久久久免费 | 欧美精品一区二区在线播放 | 中文字幕在线观看三区 | 成人黄色av免费在线观看 | 国产麻豆电影在线观看 | 国产日产精品久久久久快鸭 | 免费大片av | 色中文字幕在线观看 | 成人精品一区二区三区电影免费 | 久久av不卡| 97超碰福利久久精品 | 久草在线高清视频 | 久久久亚洲国产精品麻豆综合天堂 | 久草在线手机视频 | 亚洲精品天天 | 999国产精品视频 | 亚洲永久av | 久久影院精品 | 亚洲人天堂 | 欧美性高跟鞋xxxxhd | 日韩精品视| а中文在线天堂 | 国产女教师精品久久av | 日韩欧美国产激情在线播放 | 麻豆网站免费观看 | av免费播放 | 五月开心婷婷网 | 亚洲年轻女教师毛茸茸 | 精品在线二区 | www.伊人网.com| 国产精品网站一区二区三区 | 国产一区欧美一区 | 91在线免费观看网站 | 久久av免费电影 | 久久亚洲福利视频 | 精品免费一区 | 欧美午夜a | 成人欧美一区二区三区黑人麻豆 | 国产精品久久久久久久妇 | 激情五月开心 | 日韩电影一区二区三区在线观看 | 国产午夜一级毛片 | 成人污视频在线观看 | 国产亚洲精品久久久久久网站 | 精品欧美一区二区在线观看 | 久久99久久99精品免费看小说 | 超碰97公开 | 一区二区三区手机在线观看 | 国产精品淫 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 日韩中文字幕在线不卡 | 婷婷在线精品视频 | 蜜桃视频日本 | 国产精品一区二区三区在线看 | 精品国产一区二区三区av性色 | 在线国产视频 | 欧美一二三视频 | 国产精品免费久久久久 | 精品亚洲免a | 草樱av | 国产精品av免费 | www国产亚洲精品久久麻豆 | 波多野结衣资源 | 91在线视频免费播放 | 精品九九九| 免费成人短视频 | 欧美伦理一区 | 九九热免费精品视频 | 免费看一级 | 亚洲精品视频免费看 | 91视频啊啊啊 | 激情文学综合丁香 | 97国产精品一区二区 | 日韩在线观看第一页 | 国产一区二区三区黄 | 国产免费黄视频在线观看 | 91视视频在线直接观看在线看网页在线看 | 91视频最新网址 | 亚洲欧美成人 | 国产一级在线免费观看 | 在线观看一级 | 欧美一级片在线免费观看 | 亚洲精品国产第一综合99久久 | 日韩精品一区二 | 日韩一区二区三区高清在线观看 | 日韩视频欧美视频 | 婷婷久久一区二区三区 | 91在线公开视频 | 久久综合久久伊人 | 在线精品视频免费观看 | 欧洲一区二区三区精品 | 日本精品久久久一区二区三区 | 91av播放 | 91视频首页| 99精品一区 | 国产精品不卡av | 免费成人av在线看 | 在线观看黄色的网站 | 亚洲婷婷在线视频 | 99麻豆视频| 国产精品24小时在线观看 | 精品久久久久免费极品大片 | 在线观看涩涩 | 96久久久 | 色婷婷综合视频在线观看 | www.婷婷com | 亚洲精品字幕在线观看 | 天天干,天天干 | 精品美女视频 | 人人爽人人爽人人爽 | 欧美日韩免费在线视频 | 日韩电影黄色 | 欧美片网站yy | 黄色三级久久 | 成人激情开心网 | 奇米影视777四色米奇影院 | 欧美黑吊大战白妞欧美 | 中文字幕日韩一区二区三区不卡 | 在线观看久久久久久 | 日本久久成人 | 激情五月婷婷综合网 | 色先锋av资源中文字幕 | av免费看网站 | 国产亚洲视频在线 | 免费日韩三级 | 干干夜夜 | 日韩影视大全 | 亚洲午夜av | 中文字幕av专区 | 日日夜夜91 | 亚洲天天在线日亚洲洲精 | 在线观看免费 | 亚洲aⅴ久久精品 | 在线免费国产视频 | 日韩高清www | www.99热精品 | 成人免费 在线播放 | 香蕉视频在线播放 | 超碰人人99 | 91经典在线| 伊人色综合久久天天 | 人人精品久久 | 91精品在线免费观看视频 | 久久精品中文字幕少妇 | 在线观看免费av网 | 欧美日韩高清一区二区 | 亚洲欧美在线视频免费 | 精品视频在线播放 | 天天射射天天 | 黄色aaaaa| 国产成人福利片 | 欧美三级高清 | 欧美一级电影免费观看 | 91九色蝌蚪视频在线 | 精品久久久久久亚洲综合网 | 欧美日韩有码 | 97人人澡人人添人人爽超碰 | 狠狠的干狠狠的操 | 91看片在线免费观看 | 国产精品视频一二三 | 九九九毛片 | 国产区网址 | 久久色视频 | 在线中文字幕播放 | 免费看黄20分钟 | 久久伦理影院 | 91视频 - 88av| 欧美日韩1区2区 | 黄色三级免费网址 | 黄色毛片视频免费 | 中文字幕丰满人伦在线 | 婷婷福利影院 | 玖玖在线观看视频 | www.狠狠操.com | 亚洲国产精品传媒在线观看 | 欧美看片 | 久久 在线| 日韩午夜一级片 | 五月婷婷丁香网 | 久久影院精品 | 综合色在线| 91超级碰碰 | 国产精品久久久久久av | 国产精品麻豆果冻传媒在线播放 | 日韩一区二区免费播放 | 亚洲成av片人久久久 | 激情久久综合网 | 国产精品高清在线观看 | 亚洲综合狠狠干 | 国产又粗又猛又色 | 97成人啪啪网 | 午夜精品久久久久久中宇69 | 一级黄色在线视频 | 久久久久久久久久久久电影 | 久久久精品免费看 | 日本中文不卡 | 综合婷婷丁香 | 夜夜爱av | 久久精品99国产精品亚洲最刺激 | 久久tv| 精品欧美一区二区精品久久 | 久久不卡视频 | 成人精品999| 中文字幕av电影下载 | 日日爽天天爽 | 99热精品视| 九九久久视频 | 一区二区三区高清在线 | 成人小电影在线看 | 99精品影视| 婷婷看片 | 国产精品免费视频一区二区 | 天天做天天干 | 婷婷伊人综合亚洲综合网 | 视频 国产区 | 米奇影视7777 | 福利视频在线看 | 在线 成人 | 91福利影院在线观看 | 极品嫩模被强到高潮呻吟91 | 成人av电影免费在线播放 | 久久久久高清毛片一级 | 国产最新视频在线观看 | 三上悠亚一区二区在线观看 | 日本午夜在线亚洲.国产 | 91自拍视频在线观看 | 伊人久久精品久久亚洲一区 | 欧美极度另类 | 一区二区三区在线视频111 | 亚洲夜夜网 | 日日夜夜噜噜噜 | 久草视频精品 | 天天干天天操天天做 | 日韩成人黄色av | 日韩黄色一区 | 国产成人一区三区 | 久久久婷 | 欧美一区二区免费在线观看 | 免费av网站观看 | 国产成人av| 天天色天天干天天 | 日韩一二三区不卡 | 日韩久久一区 | 欧美日韩中 | 五月天欧美精品 | 久久66热这里只有精品 | 天天玩天天干天天操 | 亚洲成av人片在线观看 | 日韩精品一区二区免费视频 | 国产精国产精品 | 国内成人精品视频 | 中文字幕在线观看1 | 国产精品久久久久永久免费观看 | 在线观看网站黄 | 亚洲综合成人av | 国产 av 日韩| 国产视频1区2区3区 久久夜视频 | 五月婷婷视频在线 | 久久久国产精品一区二区三区 | 一区二区三区在线观看 | 91麻豆精品国产91久久久久久久久 | 国产成人久久 | 精品一区欧美 | 国产免费三级在线观看 | 黄色软件视频网站 | www.狠狠操 | 亚洲视频在线观看免费 | 视频高清| 四虎成人精品永久免费av | 国产高清成人在线 | 伊人手机在线 | 日本爱爱免费视频 | 国产中文字幕久久 | 日韩黄色免费电影 | 亚洲美女视频网 | 激情影音先锋 | 91看片在线免费观看 | 欧美日韩国产一区二区在线观看 | 97免费中文视频在线观看 | 麻豆视频成人 | 色综合色综合色综合 | 韩国精品福利一区二区三区 | 中文字幕在线第一页 | 国产一区二区免费在线观看 | 在线亚洲观看 | 日韩av免费在线看 | 成年人视频在线 | 久久激情五月丁香伊人 | 青草草在线 | 九色福利视频 | 四虎8848免费高清在线观看 | 成人av电影免费在线观看 | 久久国产精品免费看 | 特级西西444www大胆高清无视频 | 久久免费视频3 | 日韩电影一区二区在线观看 | 网站你懂的 | 国产系列精品av | 中文字幕中文字幕在线一区 | 黄色片亚洲 | 精品99久久 | 国产中文在线字幕 | 91在线免费观看国产 | 国产精品高潮久久av | 亚洲免费成人 | 免费看片网站91 | aav在线 | 亚洲高清免费在线 | 96超碰在线 | 国产在线观看地址 | 国产麻豆成人传媒免费观看 | 免费视频你懂的 | 国产免费视频一区二区裸体 | 97色在线观看免费视频 | 日韩精品高清视频 | 日韩大片在线免费观看 | 日日干视频 | 亚洲专区 国产精品 | 日日摸日日添日日躁av | 亚州av免费 | 99久久99热这里只有精品 | 中文字幕中文字幕在线一区 | 韩国av免费在线观看 | 成片免费 | 午夜av免费 | 午夜视频一区二区三区 | 日本激情动作片免费看 | 最新极品jizzhd欧美 | 午夜精品久久久久久中宇69 | 中文字幕欧美日韩va免费视频 | 国产精品久久久久999 | 国产一级做a爱片久久毛片a | 免费av片在线| av综合在线观看 | 国产亚洲一级高清 | www国产精品com| www婷婷 | 日日草天天干 | 欧美色图另类 | 99c视频高清免费观看 | 久久免费精彩视频 | 国产视频在 | 成人午夜黄色 | 91香蕉视频 mp4| 久久99国产精品免费网站 | 91精品啪在线观看国产81旧版 | 国产成在线观看免费视频 | 在线你懂 | 国内免费久久久久久久久久久 | 日韩精品在线观看视频 | 免费一级片在线观看 | 日韩中文字幕视频在线观看 | av在线影视 | 视频在线观看入口黄最新永久免费国产 | 久久久这里有精品 | 成人免费视频网 | 欧美久久久久久久久久久 | 中文字幕日韩电影 | 国产精品ⅴa有声小说 | 国产精品久久久久久久久久久久午夜片 | 久草精品视频在线看网站免费 | 亚洲成av人电影 | 色婷婷综合久色 | 日韩欧美视频在线观看免费 | 亚洲成人资源在线观看 | 久久精品三 | 国产91成人 | 久久深爱网| 国产一区二区中文字幕 | 亚洲欧美综合 | 欧美一级黄色视屏 | 日韩av免费一区二区 | 日韩三级不卡 | 婷婷在线色 | 国产精美视频 | 伊人国产在线播放 | 精品免费观看 | 97小视频 | 免费网站黄 | 五月开心综合 | www.com在线观看 | 亚洲精品国产精品国产 | 免费观看黄| 国产美女精品视频 | 久久手机免费观看 | 国产精品一区二区三区在线免费观看 | 91看片淫黄大片在线播放 | 欧美综合国产 | 国产成免费视频 | 91在线精品一区二区 | 亚洲欧美视频在线观看 | 免费在线成人av | 国产又粗又猛又黄又爽视频 | 免费高清在线观看成人 | 久久精品中文视频 | 麻豆传媒视频观看 | 日本精品一区二区三区在线观看 | 成人一级免费视频 | 天天操网站 | 日韩午夜精品 | 日本一区二区高清不卡 | 免费观看久久久 | 亚洲v精品 | 美女视频免费精品 | 欧美与欧洲交xxxx免费观看 | 91精品国产91 | 亚洲经典视频 | 国产一级特黄毛片在线毛片 | 国产黄色免费看 | h动漫中文字幕 | 在线看中文字幕 | 国产精品电影一区二区 | 亚洲尺码电影av久久 | 人人射人人爽 | 精品国产亚洲一区二区麻豆 | 久久国产精品成人免费浪潮 | 九九免费观看视频 | 国产成人a亚洲精品v | 国产成人精品综合久久久 | 天天色天天骑天天射 | 亚州精品在线视频 | 中国一 片免费观看 | 五月婷婷激情 | 免费三级在线 | 91精品电影 | 亚洲 欧美 国产 va在线影院 | 日本黄色免费大片 | 日本久久电影网 | 国产欧美精品xxxx另类 | 香蕉久草在线 | 久草男人天堂 | 黄色小说免费在线观看 | 亚洲 中文 在线 精品 | 久久精品1区| 在线观看mv的中文字幕网站 | 中文资源在线播放 | 肉色欧美久久久久久久免费看 | 国产精品久久久久久久av大片 | 国产色拍拍拍拍在线精品 | 四虎永久免费网站 | 夜夜干天天操 | 天天射天天艹 | 在线 精品 国产 | 五月婷婷在线视频 | 91黄色影视 | 日韩在线观看一区二区三区 | 久久日韩精品 | 51久久成人国产精品麻豆 | www.色午夜 | v片在线看 | 久久精品牌麻豆国产大山 | 成年美女黄网站色大片免费看 | 日本精品在线视频 | 免费av视屏 | 亚洲一区二区三区精品在线观看 | 一级一片免费看 | 亚洲视频在线视频 | 91视频最新网址 | 四虎海外影库www4hu | 久久久91精品国产 | 国产成人av一区二区三区在线观看 | 日韩三级免费观看 | 一区二区三区在线播放 | 日韩在线观看你懂的 | 国产丝袜在线 | 国产超碰在线观看 | 999在线精品| 久久免费在线视频 | 日韩激情片在线观看 | 日韩欧美在线综合网 | 久久另类视频 | 久久成人在线 | 玖玖色在线观看 | 日韩xxxxxxxxx | 国产成人精品一区二区三区免费 | 欧美精品中文在线免费观看 | 精品99999 | 免费在线观看a v | 香蕉视频免费看 | 欧美人体xx | 亚洲天堂免费视频 | 国产一卡久久电影永久 | 久久精品国产美女 | 欧美大片第1页 | 六月婷婷久香在线视频 | 久久久免费精品国产一区二区 | 日本黄色免费电影网站 | 在线一区电影 | 一区二区三区在线不卡 | 婷婷综合影院 | 色婷婷狠狠五月综合天色拍 | 亚洲黄色小说网 | 亚洲高清视频在线观看免费 | 一区二区三区高清不卡 | 日本深夜福利视频 | 日日操日日干 | 日韩精品久久久久久久电影99爱 | 超碰在线94 | 亚洲欧美日本国产 | 天天天天天天干 | 日韩女同av | 久久高清av | 免费黄色小网站 | 亚洲电影一级黄 | 99在线视频观看 | 女人高潮特级毛片 | 美女视频永久黄网站免费观看国产 | 国产美腿白丝袜足在线av | 亚洲观看黄色网 | 国产精品一区二区在线播放 | 五月天伊人网 | 一区精品在线 | 国产91在线免费视频 | 韩国一区二区av | av在线a | 4438全国亚洲精品观看视频 | 中文 一区二区 | 亚洲一区视频免费观看 | 日韩av免费在线电影 | 日韩免费在线观看 | 色综合婷婷 | 亚洲最新在线视频 | 亚洲资源视频 | 国产首页| 日韩欧美在线中文字幕 | 日韩欧美xxxx| av综合 日韩| 日韩四虎 | 激情网在线观看 | 99久热在线精品视频成人一区 | 日本公妇色中文字幕 | 97超碰在线播放 | 色综合咪咪久久网 | 午夜精品久久久久久久99婷婷 | 四虎在线观看 | 毛片二区 | 欧美做受69 | 亚洲在线视频免费 | av黄网站 | 国产午夜精品一区二区三区在线观看 | 爱爱av在线| 国产精品资源 | 黄色三级免费观看 | 成人片在线播放 | www.久久精品视频 | 九色91在线 | 三上悠亚一区二区在线观看 | 久久国内精品视频 | 99精品视频精品精品视频 | 99这里精品 | 国产免费叼嘿网站免费 | 国产精品九九久久久久久久 | 天天操天天干天天插 | 日日爱网站 | 亚洲精品综合在线观看 | 在线观看精品一区 | 亚洲一区视频免费观看 | 深夜免费福利视频 | 91av手机在线观看 | 久热这里有精品 | 国产精品一区二区在线观看 | 国产精品99久久久久 | 成人黄色电影在线观看 | 日韩资源在线观看 | 精品国产一区二区三区在线观看 | 手机看片福利 | 美女视频a美女大全免费下载蜜臀 | 97日日碰人人模人人澡分享吧 | 国产视频一区在线免费观看 | 色综合激情久久 | 日韩免费一级a毛片在线播放一级 | 午夜久久久久久久 | 中文字幕在线日 | 九九精品久久 | 亚洲传媒在线 | 韩国av一区二区三区在线观看 | 国产乱对白刺激视频不卡 | 天天干天天草天天爽 | 久久国内精品99久久6app | 亚洲精品自拍 | 91观看视频 | 天天色棕合合合合合合 | 亚洲黄色网络 | 色综合久久综合中文综合网 | 最新中文字幕 | 免费在线观看一区二区三区 | 亚洲成人频道 | 色综合久久88色综合天天6 | 97精品一区 | 日本精品午夜 | 婷婷丁香在线视频 | 中文字幕一区在线 | 久精品在线 | 狠狠色伊人亚洲综合成人 | 成人小视频在线免费观看 | 久久久麻豆视频 | 免费在线观看黄网站 | 欧美日韩一区二区三区免费视频 | 日韩和的一区二在线 | 国产99久久精品一区二区永久免费 | 日韩精品一区二区在线观看视频 | 国产精品 欧美 日韩 | 99精品久久精品一区二区 | 国产中文字幕在线视频 | 人人澡人人爽欧一区 | wwwwww国产 | 久久不射电影院 | 黄色软件网站在线观看 | 午夜黄色大片 | 丁香激情综合久久伊人久久 | 十八岁免进欧美 | 一级成人免费 | 中文字幕成人在线观看 | 婷婷色综 | 97在线精品视频 | www五月天com| 亚洲午夜精品一区二区三区电影院 | 天天射天 | 亚洲一区免费在线 | 久久在线| 国产午夜精品理论片在线 | 国产中文 | 国产精品一区二区久久 | 久久这里只精品 | 天天干天天拍 | 97av在线视频 | 日日干综合 | 中文字幕乱偷在线 | 夜夜骑首页 | 婷婷电影在线观看 | av官网在线 | 亚洲一区欧美激情 | 国产精品久久久久久麻豆一区 | 欧美日韩高清 | 激情婷婷在线 | 日本精品久久久久久 | 亚洲最大成人免费网站 | 亚洲日本va中文字幕 | 欧美成年人在线观看 | 成年人在线观看 | www一起操 | av直接看| 人人草在线视频 | 精品女同一区二区三区在线观看 | 亚洲精品一区二区18漫画 | 色综合婷婷久久 | 麻豆视频观看 | 国产一级高清 | 天天干天天做天天操 | www日韩在线观看 | 国产视频在线观看一区 | 超碰97在线人人 | 中文字幕av在线电影 | 久久久18 | 一级黄色电影网站 | 国产欧美精品xxxx另类 | 91丨九色丨国产在线观看 | 国产精品亚洲成人 | 热久久最新地址 | 天天操天天操天天爽 | 婷婷99| 久久精品久久国产 | 国产黄色片久久久 | 国产精品av在线 | 日韩在线电影一区 | 国产在线观看 | 亚洲成人资源在线观看 | 久久中文字幕视频 | 久久久久综合视频 | 免费高清无人区完整版 | a视频免费 | 新av在线 | 91精品久久久久久综合乱菊 | 97超碰国产精品女人人人爽 | 五月婷婷婷婷婷 | 欧美精品乱码久久久久久 | 亚洲天天摸日日摸天天欢 | 久久成人精品视频 | 久久免费国产 | 色综合久久久久久中文网 | 欧美视频一区二 | 国产美腿白丝袜足在线av | 97手机电影网 | 免费成人黄色av | 丝袜美腿在线视频 | 人人爽人人射 | 97超碰免费 | 91在线看黄 | 超碰在线最新 | 久久久国产精品久久久 | av直接看| 亚洲午夜久久久影院 | 黄色小网站免费看 | 久久国产视频网站 | 精品一区三区 | 国产精品mv在线观看 | 久久爱www.| 三级黄色大片在线观看 | 2019中文字幕网站 | 欧洲精品视频一区二区 | 精品一区二区在线免费观看 | 不卡的一区二区三区 | 国产成人精品女人久久久 | 色视频在线观看 | av网站在线观看免费 | 久久99精品国产麻豆婷婷 | 18岁免费看片 | 亚一亚二国产专区 | 久久久一本精品99久久精品66 | 午夜精品一区二区三区免费 | 日韩在线精品视频 | 在线观看福利网站 | 中国一级片在线观看 | 久久久精品免费看 | 日韩一级成人av | 亚洲乱码国产乱码精品天美传媒 | 人人澡av | 亚洲国产成人在线播放 | 国产精品理论在线观看 | 91成人区 | 色综合中文综合网 | 国产精品亚洲人在线观看 | 国产精品第2页 | 超碰在线中文字幕 | 国产91丝袜在线播放动漫 | 国产黄色成人 | 狠狠躁夜夜躁人人爽超碰91 | 人人涩| 久久综合婷婷国产二区高清 | 97视频免费在线观看 | 精品国产乱码一区二区三区在线 | 美女在线黄| 亚洲免费不卡 | 欧美九九视频 | 色婷婷狠狠| 伊人精品影院 | av中文资源在线 | av资源在线看 | 国产高清视频在线免费观看 | 欧美激情第一区 | 97超碰免费在线观看 | 亚洲精品国产拍在线 | 成人一级免费视频 | 人人玩人人添人人 | 婷婷精品在线视频 | 国产黄在线免费观看 | 久久婷婷综合激情 | 精品国精品自拍自在线 | 天天操天天吃 | 精品视频在线视频 | 美女视频a美女大全免费下载蜜臀 | 韩国av电影在线观看 | 久久综合9988久久爱 | 亚洲视频电影在线 | 黄色特级一级片 | 色午夜 | www五月天婷婷 | 国产又黄又猛又粗 | 亚洲一区视频免费观看 | 欧美性久久久 | 日韩欧美国产精品 | 成人午夜在线观看 | 2019精品手机国产品在线 | 色福利网| 欧美日韩一区二区在线观看 | 顶级bbw搡bbbb搡bbbb | 操老逼免费视频 | 午夜视频色| 丁香婷婷激情五月 | 一区二区三区精品在线 | 国产系列 在线观看 | 午夜999 | 日本精品久久久久影院 | 色com| av在线播放不卡 | 狠狠天天 | 欧美日韩一级久久久久久免费看 | 国产在线精品视频 | 91九色视频国产 | 午夜在线国产 | 有没有在线观看av | 欧美视频18 | 黄色免费网 | 日韩一二区在线观看 | 人人爽人人爽人人片av | 日韩免费二区 | 在线看污网站 | 久久久精品 | 91.dizhi永久地址最新 | 成人在线播放网站 | 中文字幕在线一区二区三区 | 日本精品午夜 | 成人在线一区二区 | 黄色av观看 | 婷婷色五| 亚洲免费成人av电影 | 草久久精品 | 精品久久久一区二区 | 97超碰免费在线观看 | 九九热免费在线视频 | 久久综合在线 | 99精品视频网站 | 欧美另类亚洲 | 手机在线黄色网址 | 久久视频免费在线观看 | 亚洲精品小区久久久久久 | 国产精品久久久久久超碰 | 91久久精品日日躁夜夜躁国产 | 亚洲视频在线观看免费 | 国产高清免费观看 | 婷婷香蕉 | 美女网站在线观看 | 黄色av一区二区 | 国产伦精品一区二区三区在线 | 亚洲成av片人久久久 | 日日夜夜精品免费视频 | 又黄又爽又无遮挡的视频 | av观看在线观看 | 精品久久久久久久久亚洲 | 精品二区视频 | 不卡电影免费在线播放一区 | 伊人中文网 | 亚洲精品免费观看 | 久久97久久| 亚洲高清视频在线播放 | 国产午夜麻豆影院在线观看 | 国产精品系列在线观看 | 成人av.com| 久亚洲精品 | 国产麻豆电影 | 国产精品久久久久久电影 | 91在线中文字幕 | 国内精品久久久久 | 97色涩| 国产精品一区二区av影院萌芽 | 国产欧美久久久精品影院 | 国产字幕在线观看 | 色橹橹欧美在线观看视频高清 | 国产麻豆精品免费视频 | 91麻豆福利 | 中文字幕国产亚洲 | 在线亚洲欧美视频 | 日韩免费一级电影 | 国产精品自产拍在线观看桃花 | 色婷婷一| 欧美精品久久久久久久久免 | 中文国产在线观看 | 97视频在线免费观看 | 色多多视频在线 | 天天干天天做 | 久久久久久久久久久福利 | 99热这里| 国产在线高清视频 | 欧美视屏一区二区 | 韩国精品在线观看 | 国产日韩欧美在线影视 | 久久久久五月天 | 日本一区二区免费在线观看 | 欧美久久精品 | 天天躁日日躁狠狠躁av中文 | 亚洲精品在线网站 | 超碰在线97观看 | 亚洲综合视频在线 | 亚洲激情一区二区三区 | 黄色美女免费网站 | 98精品国产自产在线观看 | 亚洲国产三级在线观看 | 久久免费中文视频 | 在线电影a| 国产91综合一区在线观看 | 久久精品精品电影网 | 丁香六月五月婷婷 | 奇米影视8888在线观看大全免费 | 国产精品女人久久久 | 最近2019好看的中文字幕免费 | 日韩系列 | 精品国产三级 | 亚洲激情免费 | 激情五月网站 | 国产精品亚州 | 久久婷婷精品视频 | 日韩偷拍精品 | 日韩精品在线一区 | 特级毛片网 | 日日夜夜添 | 黄色大片中国 | 99色在线播放 | 日韩综合在线观看 | 天天操夜夜做 | 午夜国产一区二区三区四区 | 91免费版成人 | 91在线视频免费观看 | 国产在线视频不卡 | 91大片成人网 | 国产精品久久久久久久久久久不卡 | 精品久久一二三区 | 亚洲国产99 | 日日躁夜夜躁xxxxaaaa | 99国产高清 | 国产精品一区二区久久精品爱微奶 | 伊人天堂网| 国产黄色精品在线 | 97电影网手机版 | 亚洲综合成人婷婷小说 | 欧美一区二区日韩一区二区 | 免费视频 你懂的 | 九九视频在线观看视频6 | 国产99区| 91网在线观看 | 岛国一区在线 | 国产一区在线视频播放 | 精品久久久久久久久久久久久久久久久久 | 欧美国产大片 | 中文字幕高清免费日韩视频在线 | 午夜久久网 |