亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#-Socket監聽消息處理

2019-11-10 18:01:41
字體:
來源:轉載
供稿:網友

搬運整合三個使用C#實現Socket編程的例子,包含服務器端和客戶端。

原文鏈接:

C# socket監聽

C#-Socket監聽消息處理

基于C#的socket編程的TCP同步實現

按照鏈接順序貼上原文。

例子一:

網絡通訊流程如上

服務器:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace _06Server{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        PRivate void btnStart_Click(object sender, EventArgs e)        {            try            {                //當點擊開始監聽的時候 在服務器端創建一個負責監ip地址跟端口號的Socket                Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                IPAddress ip = IPAddress.Any;//IPAddress.Parse(txtServer.Text);                //創建端口號對象                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));                //監聽                socketWatch.Bind(point);                ShowMsg("監聽成功");                socketWatch.Listen(10);                Thread th = new Thread(Listen);                th.IsBackground = true;                th.Start(socketWatch);            }            catch            {                           }        }        /// <summary>        /// 等待客戶端的連接 并且創建與之通信用的Socket        /// </summary>        ///         Socket socketSend;        void Listen(object o)        {            Socket socketWatch = o as Socket;            //等待客戶端的連接 并且創建一個負責通信的Socket            while (true)            {                try                {                    //負責跟客戶端通信的Socket                    socketSend = socketWatch.Accept();                    //將遠程連接的客戶端的IP地址和Socket存入集合中                    dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);                    //將遠程連接的客戶端的IP地址和端口號存儲下拉框中                    cboUsers.Items.Add(socketSend.RemoteEndPoint.ToString());                    //192.168.11.78:連接成功                    ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "連接成功");                    //開啟 一個新線程不停的接受客戶端發送過來的消息                    Thread th = new Thread(Recive);                    th.IsBackground = true;                    th.Start(socketSend);                }                catch                { }            }        }        //將遠程連接的客戶端的IP地址和Socket存入集合中        Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();        /// <summary>        /// 服務器端不停的接受客戶端發送過來的消息        /// </summary>        /// <param name="o"></param>        void Recive(object o)        {            Socket socketSend = o as Socket;            while (true)            {                try                {                    //客戶端連接成功后,服務器應該接受客戶端發來的消息                    byte[] buffer = new byte[1024 * 1024 * 2];                    //實際接受到的有效字節數                    int r = socketSend.Receive(buffer);                    if (r == 0)                    {                        break;                    }                    string str = Encoding.UTF8.GetString(buffer, 0, r);                    ShowMsg(socketSend.RemoteEndPoint + ":" + str);                }                catch                { }            }        }        void ShowMsg(string str)        {            txtLog.AppendText(str + "/r/n");        }        private void Form1_Load(object sender, EventArgs e)        {            Control.CheckForIllegalCrossThreadCalls = false;        }        /// <summary>        /// 服務器給客戶端發送消息        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnSend_Click(object sender, EventArgs e)        {            string str = txtMsg.Text;            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);            List<byte> list = new List<byte>();            list.Add(0);            list.AddRange(buffer);            //將泛型集合轉換為數組            byte[] newBuffer = list.ToArray();            //buffer = list.ToArray();不可能            //獲得用戶在下拉框中選中的IP地址            string ip = cboUsers.SelectedItem.ToString();            dicSocket[ip].Send(newBuffer);            //     socketSend.Send(buffer);        }        /// <summary>        /// 選擇要發送的文件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnSelect_Click(object sender, EventArgs e)        {            OpenFileDialog ofd = new OpenFileDialog();            ofd.InitialDirectory = @"C:/Users/SpringRain/Desktop";            ofd.Title = "請選擇要發送的文件";            ofd.Filter = "所有文件|*.*";            ofd.ShowDialog();            txtPath.Text = ofd.FileName;        }        private void btnSendFile_Click(object sender, EventArgs e)        {            //獲得要發送文件的路徑            string path = txtPath.Text;            using (FileStream fsRead = new FileStream(path, FileMode.Open, Fileaccess.Read))            {                byte[] buffer = new byte[1024 * 1024 * 5];                int r = fsRead.Read(buffer, 0, buffer.Length);                List<byte> list = new List<byte>();                list.Add(1);                list.AddRange(buffer);                byte[] newBuffer = list.ToArray();                dicSocket[cboUsers.SelectedItem.ToString()].Send(newBuffer, 0, r+1, SocketFlags.None);            }        }        /// <summary>        /// 發送震動        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnZD_Click(object sender, EventArgs e)        {            byte[] buffer = new byte[1];            buffer[0] = 2;            dicSocket[cboUsers.SelectedItem.ToString()].Send(buffer);        }    }}客戶端:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.IO;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Threading.Tasks;using System.Windows.Forms;namespace _07Client{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        Socket socketSend;        private void btnStart_Click(object sender, EventArgs e)        {            try            {                //創建負責通信的Socket                socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                IPAddress ip = IPAddress.Parse(txtServer.Text);                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));                //獲得要連接的遠程服務器應用程序的IP地址和端口號                socketSend.Connect(point);                ShowMsg("連接成功");                //開啟一個新的線程不停的接收服務端發來的消息                Thread th = new Thread(Recive);                th.IsBackground = true;                th.Start();            }            catch            { }                    }        /// <summary>        /// 不停的接受服務器發來的消息        /// </summary>        void Recive()        {            while (true)            {                try                {                    byte[] buffer = new byte[1024 * 1024 * 3];                    int r = socketSend.Receive(buffer);                    //實際接收到的有效字節數                    if (r == 0)                    {                        break;                    }                    //表示發送的文字消息                    if (buffer[0] == 0)                    {                        string s = Encoding.UTF8.GetString(buffer, 1, r-1);                        ShowMsg(socketSend.RemoteEndPoint + ":" + s);                    }                    else if (buffer[0] == 1)                    {                        SaveFileDialog sfd = new SaveFileDialog();                        sfd.InitialDirectory = @"C:/Users/SpringRain/Desktop";                        sfd.Title = "請選擇要保存的文件";                        sfd.Filter = "所有文件|*.*";                        sfd.ShowDialog(this);                        string path = sfd.FileName;                        using (FileStream fsWrite = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))                        {                            fsWrite.Write(buffer, 1, r - 1);                        }                        MessageBox.Show("保存成功");                    }                    else if (buffer[0] == 2)                    {                        ZD();                    }                                }                catch { }            }        }        /// <summary>        /// 震動        /// </summary>        void ZD()        {            for (int i = 0; i < 500; i++)            {                this.Location = new Point(200, 200);                this.Location = new Point(280, 280);            }        }        void ShowMsg(string str)        {            txtLog.AppendText(str + "/r/n");        }        /// <summary>        /// 客戶端給服務器發送消息        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void btnSend_Click(object sender, EventArgs e)        {            string str = txtMsg.Text.Trim();            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);            socketSend.Send(buffer);        }        private void Form1_Load(object sender, EventArgs e)        {            Control.CheckForIllegalCrossThreadCalls = false;        }        private void txtServer_TextChanged(object sender, EventArgs e)        {        }    }}例子二:

TCP/IP:Transmission Control Protocol/Internet Protocol,傳輸控制協議/因特網互聯協議,又名網絡通訊協議。簡單來說:TCP控制傳輸數據,負責發現傳輸的問題,一旦有問題就發出信號,要求重新傳輸,直到所有數據安全正確地傳輸到目的地,而IP是負責給因特網中的每一臺電腦定義一個地址,以便傳輸。TCP協議在許多分布式應用程序中進行消息命令傳遞是必不可少的部分。

TCP通信的三次握手:三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和服務器總共發送3個包。

第一次握手:客戶端發送一個TCP的SYN標志位置1的包指明客戶打算連接的服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段里。第二次握手:服務器發回確認包(ACK)應答。即SYN標志位和ACK標志位均為1同時,將確認序號(Acknowledgement Number)設置為客戶的I S N加1以.即X+1。第三次握手:客戶端再次發送確認包(ACK) SYN標志位為0,ACK標志位為1.并且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.并且在數據段放寫ISN的+1

先看下服務端Socket監聽代碼:

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;namespace SocketDome{    /// <summary>    /// 處理Socket監聽邏輯    /// </summary>    public class SocketProvider    {        private static Socket serviceSocketListener; //Socke監聽處理請求        /// <summary>        /// 開啟Socket監聽        /// </summary>        public static void Init()        {            serviceSocketListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            serviceSocketListener.Bind(new IPEndPoint(IPAddress.Parse("10.0.0.217"), 20000)); //IP和端口應該是可配置            serviceSocketListener.Listen(1024);            Thread handleSocket = new Thread(new ThreadStart(HandleSocket));            handleSocket.Start();        }        /// <summary>        /// 監聽鏈接        /// </summary>        private static void HandleSocket()        {            while (true)            {                try                {                    Socket currSocket = serviceSocketListener.Accept();  //為新建連接創建新的 System.Net.Sockets.Socket                    Thread processThread = new Thread(new ParameterizedThreadStart(ProcessSocket));                    processThread.Start(currSocket);                }                catch { }            }        }        /// <summary>        /// 處理Socket信息        /// </summary>        /// <param name="obj">新建連接創建新Socket對象</param>        private static void ProcessSocket(object obj)        {            Socket currSocket = (Socket)obj;            try            {                byte[] recvBytess = new byte[1048576];                int recbytes;                recbytes = currSocket.Receive(recvBytess, recvBytess.Length, 0);                if (recbytes > 0)                {                    var contentStr = Encoding.UTF8.GetString(recvBytess, 0, recbytes);                    var _order = contentStr.Split('~');                    byte[] sendPass = Encoding.UTF8.GetBytes(_order[0].ToUpper() + "#SUCCESS"); //先相應對話,然后去異步處理                    currSocket.Send(sendPass, sendPass.Length, SocketFlags.None);                    switch (_order[0].ToUpper())                    {                         case"ADDCACHE":                            Console.WriteLine("添加緩存消息" + _order[1]);                           //處理ADDCACHE邏輯                           Console.WriteLine("寫Log日志");                            break;                        default :                            Console.WriteLine("命令錯誤");                            Console.WriteLine("寫Log日志");                            break;                    }                }            }            catch (Exception ex)            {                Console.WriteLine("寫Error日志" + ex.Message);            }        }    }}

這個服務端,監聽著客戶端發來的命令,格式定義為:命令~參數,在服務端接受到客戶端的命令消息后立即回傳接到命令并開始處理,進行異步處理避免客戶端等待。

下面看下客戶端的Socket客戶端主動請求服務端代碼:

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Sockets;using System.Text;namespace Consoleapplication7{    /// <summary>    /// Socket Helper    /// </summary>    public class SocketHelper    {        private string ip;        private IPEndPoint ex;        private Socket socket;        public SocketHelper(string ip, int port)        {            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            this.ip = ip;            this.ex = new IPEndPoint(IPAddress.Parse(ip), port);        }        /// <summary>        /// Socket 進行連接        /// </summary>        /// <returns>連接失敗OR成功</returns>        public bool Socketlink()        {            try            {                socket.Connect(ex);                return true;            }            catch (Exception ex)            {                return false;            }        }        /// <summary>        /// Socket 發送消息        /// </summary>        /// <param name="strmsg">消息</param>        public void SendVarMessage(string strmsg)        {            try            {                byte[] msg = System.Text.Encoding.UTF8.GetBytes(strmsg);                this.socket.Send(msg);            }            catch (Exception ex)            {                this.socket.Close();            }        }        /// <summary>        /// Socket 消息回傳        /// </summary>        /// <returns></returns>        public string ReceiveMessage()        {            try            {                byte[] msg = new byte[1048576];                int recv = socket.Receive(msg);                this.socket.Close();                return System.Text.Encoding.UTF8.GetString(msg, 0, recv);            }            catch (Exception ex)            {                this.socket.Close();                return "ERROR";            }        }    }}
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication7{    class Program    {        static void Main(string[] args)        {            SocketHelper socket = new SocketHelper("10.0.0.217",20000);            if(socket.Socketlink())            {                Console.WriteLine("連接成功");                socket.SendVarMessage("ADDCACHE~張三");                string strReposon = socket.ReceiveMessage();                Console.WriteLine(strReposon);            }            Console.Read();        }    }}首先以管理園身份開啟服務端查詢,然后客戶端主動請求服務端進行消息請求。

例子三:

一、摘要

  總結一下基于C#的TCP傳輸協議的涉及到的常用方法及同步實現。

二、實驗平臺

  Visual Studio 2010

三、socket編程的一些常用方法(同步實現)

3.1 命名空間

  需要添加的命名空間

using System.Net;using System.Net.Socket;

3.2 構造新的socket對象

socket原型:
public socket (AddressFamily addressFamily,SocketType sockettype,ProtocolType protocolType)

(1) AddressFamily 用來指定socket解析地址的尋址方案,Inte.Network標示需要ip版本4的地址,Inte.NetworkV6需要ip版本6的地址;

(2) SocketType 參數指定socket類型,Raw支持基礎傳輸協議訪問,Stream支持可靠,雙向,基于連接的數據流;

(3) ProtocolType 表示socket支持的網絡協議,如常用的TCP和UDP協議。

3.3 定義主機對象(1) IPEndPoint類

原型:

a)  

public IPEndPoint(IPAddress address,int port)  

參數address可以直接填寫主機的IP,如"192.168.2.1";

b)

public IPEndPoint(long address,int port)

參數address整型int64如123456,參數port端口int32,如6655。

(2) 利用DNS服務器解析主機,使用Dns.Resolve方法

原型:

public static IPHostEntry Resolve(string hostname)

參數:待解析的主機名稱,返回IPHostEntry類值,IPHostEntry為Inte.Net主機地址信息提供容器,該容器提供存有IP地址列表,主機名稱等。

(3) Dns.GetHostByName獲取本地主機名稱

原型:

public static IPHostEntry GetHostByName(string hostname)

(4) GetHostByAddress

原型:

a)

public static IPHostEntry GetHostByAddress(IPAddress address)

參數:IP地址。

b)

public static IPHostEntry GetHostByAddress(string address)

參數:IP地址格式化字符串。

3.4 端口綁定和監聽

  同步套接字服務器主機的綁定和端口監聽,Socket類的Bind(綁定主機),Listen(監聽端口),Accept(接收客戶端的連接請求)。

(1) Bind

原型:

public void Bind(EndPoint LocalEP)

參數為主機對象 IPEndPoint

(2) Listen

原型:

public void Listen(int backlog)

參數整型數值,掛起隊列最大值

(3) accept

原型:

public socket accept()

返回為套接字對象

3.5 socket的發送和接收方法

(1) 發送數據

a)socket類的send方法

原型一:

public int Send(byte[] buffer)

參數:待發送的字節數組;

原型二:

public int Send(byte[],SocketFlags)

SocketFlags成員列表:

DontRoute不使用路由表發送,

MaxIOVectorLength為發送和接收數據的wsabuf結構數量提供標準值,

None 不對次調用使用標志,

OutOfBand消息的部分發送或接收,

Partial消息的部分發送或接收,

Peek查看傳入的消息。

原型三:

public int Send(byte[],int,SocketFlags)

參數二要發送的字節數

原型四:

public int Send(byte[],int,int,SocketFlags)

參數二為Byte[]中開始發送的位置

b) NetWordStream類的Write方法

原型:

public override void write(byte[] buffer,int offset,int size)

參數分別為:字節數組,開始字節位置,總字節數。

(2) 接收數據

a) Socket類Receive方法

原型一:

public int Receive(byte[] buffer) 原型二:

public int Receive(byte[],SocketFlags)原型三:

public int Receive(byte[],int,SocketFlags)  

原型四:

public int Receive(byte[],int,int,SocketFlags)

Socket類Receive方法的相關參數可參看Socket類Send方法中的參數。

b) NetworkStream類的Read方法

public override int Read(int byte[] buffer,int offset,int size)

參數可參看NetworkStream類的Write方法。

四、TCP傳輸協議的同步實現

 4.1 服務器端編程的步驟:

 (1) 創建套接字;

 (2) 綁定套接字到一個IP地址和一個端口上(bind());

 (3)將套接字設置為監聽模式等待連接請求(listen());

 (4)請求到來后,接受連接請求,返回一個新的對應于此次連接的套接字(accept());

 (5)用返回的套接字和客戶端進行通信(send()/recv());

 (6)返回,等待另一連接請求;

 (7)關閉套接字。

服務器端代碼:

using System;using System.Net;using System.Net.Sockets;using System.Collections.Generic;using System.Text;namespace net{    class Program    {        static void Main(string[] args)        {            //定義接收數據長度變量            int recv;            //定義接收數據的緩存            byte[] data = new byte[1024];            //定義偵聽端口            IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 5566);            //定義套接字類型            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //連接            socket.Bind(ipEnd);            //開始偵聽            socket.Listen(10);            //控制臺輸出偵聽狀態            Console.Write("Waiting for a client");            //一旦接受連接,創建一個客戶端            Socket client = socket.Accept();            //獲取客戶端的IP和端口            IPEndPoint ipEndClient = (IPEndPoint)client.RemoteEndPoint;            //輸出客戶端的IP和端口            Console.Write("Connect with {0} at port {1}", ipEndClient.Address, ipEndClient.Port);            //定義待發送字符            string welcome = "Welcome to my server";            //數據類型轉換            data = Encoding.ASCII.GetBytes(welcome);            //發送            client.Send(data, data.Length, SocketFlags.None);            while (true)            {                //對data清零                data = new byte[1024];                //獲取收到的數據的長度                recv = client.Receive(data);                //如果收到的數據長度為0,則退出                if (recv == 0)                    break;                //輸出接收到的數據                Console.Write(Encoding.ASCII.GetString(data, 0, recv));                //將接收到的數據再發送出去                client.Send(data, recv, SocketFlags.None);            }            Console.Write("Disconnect form{0}", ipEndClient.Address);            client.Close();            socket.Close();        }    }}

4.2 客戶端編程的步驟:

(1) 創建套接字;

(2) 向服務器發出連接請求(connect());

(3) 和服務器端進行通信(send()/recv());

(4) 關閉套接字。

客戶端代碼:

using System;using System.Net;using System.Net.Sockets;using System.Collections.Generic;using System.Text;namespace client{    class Program    {        static void Main(string[] args)        {            //定義發送數據緩存            byte[] data = new byte[1024];            //定義字符串,用于控制臺輸出或輸入            string input, stringData;            //定義主機的IP及端口            IPAddress ip = IPAddress.Parse("127.0.0.1");            IPEndPoint ipEnd = new IPEndPoint(ip, 5566);            //定義套接字類型            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);            //嘗試連接            try            {                socket.Connect(ipEnd);            }            //異常處理            catch (SocketException e)            {                Console.Write("Fail to connect server");                Console.Write(e.ToString());                return;            }            //定義接收數據的長度            int recv = socket.Receive(data);            //將接收的數據轉換成字符串            stringData = Encoding.ASCII.GetString(data, 0, recv);            //控制臺輸出接收到的數據            Console.Write(stringData);            //定義從鍵盤接收到的字符串            input = Console.ReadLine();            //將從鍵盤獲取的字符串轉換成整型數據并存儲在數組中                data = Encoding.ASCII.GetBytes(input);            //發送該數組            socket.Send(data, data.Length, SocketFlags.None);            while (true)            {                //                //如果字符串是"exit",退出while循環                if (input == "exit")                {                    break;                }                //對data清零                data = new byte[1024];                //定義接收到的數據的長度                recv = socket.Receive(data);                //將接收到的數據轉換為字符串                stringData = Encoding.ASCII.GetString(data, 0, recv);                //控制臺輸出字符串                Console.Write(stringData);                //發送收到的數據                socket.Send(data, recv, 0);            }            Console.Write("disconnect from server");            socket.Shutdown(SocketShutdown.Both);            socket.Close();        }    }}上述代碼實現了,當連接建立之后,客戶端向服務器端發送鍵盤輸入的字符,服務器端收到字符后,顯示在控制臺并發送給客戶端,客戶端收到字符后,顯示在控制臺并再次發送給服務器端,如此循環。

五、實驗結果

  先后運行服務器端程序和客戶端程序,控制臺界面如下:

圖1 服務器端控制臺

  當連接建立后,服務器端控制臺顯示等待客戶端的狀態"Waiting for a client",并打印出連接信息。

圖2 客戶端控制臺

  當連接建立后,客戶端收到來自服務器端發送的字符串"Welcome to my server"。

  之后,客戶端通過鍵盤發送數據,二者循環接收并發送,控制臺分別如下:

圖3 服務器控制臺

圖4 客戶端控制臺

六、幾點說明

6.1 傳輸速度

  (1) 增大發送和接收的數組可提升傳輸速度,即增加一次實際發送數據的數量可以提高傳輸速度,但數組中數據的個數也不能一味的增大。需要說明的,由于地層MIT的限制,底層具體實現的時候每次發送的數據仍是不超過1510個的。

  (2) 將控制臺界面最小化后,速度也會有翻倍的提升。

6.2 MFC的轉換

  為了使傳輸協議更有可觀性和使用性,通常做成MFC的樣式,具體的使用已在基于TCP協議的網絡攝像頭的設計與實現應用。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线一区二区| 亚洲精品v欧美精品v日韩精品| 欧美麻豆久久久久久中文| 亚洲第一中文字幕在线观看| 欧美裸体xxxx极品少妇| 亚洲免费伊人电影在线观看av| 色偷偷偷综合中文字幕;dd| 中文字幕亚洲欧美一区二区三区| 精品福利一区二区| 国产日韩在线亚洲字幕中文| 成人激情视频在线观看| 国产香蕉精品视频一区二区三区| 亚洲亚裔videos黑人hd| 最近的2019中文字幕免费一页| 亚洲成年人在线播放| 韩国视频理论视频久久| 欧美老女人在线视频| 欧美激情欧美狂野欧美精品| 久久久久在线观看| 日韩小视频在线观看| 国产精品草莓在线免费观看| 欧美午夜精品久久久久久浪潮| 国产日韩精品在线| 青青久久av北条麻妃海外网| 国产精品香蕉在线观看| 国产日韩中文字幕在线| 亚洲国产精品va在线看黑人| 国产精品网站入口| 国产欧美一区二区三区在线看| 色噜噜国产精品视频一区二区| 久久久噜久噜久久综合| 亚洲国产精品成人精品| 91av成人在线| 久久91亚洲精品中文字幕奶水| 国产精品自在线| 亚洲欧洲美洲在线综合| 全亚洲最色的网站在线观看| 亚洲欧美在线x视频| 欧美性感美女h网站在线观看免费| 97精品在线观看| 久久精品影视伊人网| 黑人狂躁日本妞一区二区三区| 日韩av网站导航| 日韩av在线网站| 国产成人亚洲精品| 激情久久av一区av二区av三区| 国产91网红主播在线观看| 亚洲性生活视频| 成人中文字幕在线观看| 国产精品日韩久久久久| 亚洲欧美另类中文字幕| 狠狠色香婷婷久久亚洲精品| 日韩成人在线网站| 成人国产精品一区二区| 久久久久久亚洲精品中文字幕| 久久久久久久激情视频| 国产成人精品久久亚洲高清不卡| 亚洲免费影视第一页| 国产精品91久久久久久| 精品久久久久久久久久久久| 成人国产精品日本在线| 国产精品1区2区在线观看| 日韩在线观看免费网站| 亚洲国产精品一区二区三区| 国产精品久久久av久久久| 2018中文字幕一区二区三区| 日韩免费观看在线观看| 8050国产精品久久久久久| 国产精品美腿一区在线看| 欧日韩不卡在线视频| 中文字幕亚洲综合久久| 亚洲国产精品专区久久| 国产精品三级网站| 在线中文字幕日韩| 欧美激情伊人电影| 欧美超级乱淫片喷水| 欧美视频13p| 成人免费网站在线看| 亚洲人成在线观看网站高清| 国产丝袜精品视频| 欧美激情综合色综合啪啪五月| 日韩中文理论片| 伦伦影院午夜日韩欧美限制| 97不卡在线视频| 亚洲美女免费精品视频在线观看| 久久久久日韩精品久久久男男| 久久精品国产亚洲精品| 欧美高清在线播放| 亚洲午夜性刺激影院| 日韩在线视频网站| 一区二区三区视频免费在线观看| 91久久久久久久| 国产精品福利网| 日韩精品久久久久| 国产ts一区二区| 一本色道久久88亚洲综合88| 欧美黄色www| 日韩精品在线观看一区二区| 性金发美女69hd大尺寸| 亚洲成人久久久久| 欧美精品18videos性欧| 成人www视频在线观看| 俺去亚洲欧洲欧美日韩| 91国自产精品中文字幕亚洲| 欧美中文字幕第一页| 欧美极品少妇xxxxⅹ喷水| 亚洲成人精品视频在线观看| 欧美激情亚洲精品| 国产亚洲欧洲黄色| 懂色av中文一区二区三区天美| 国内偷自视频区视频综合| 国产在线播放91| 国内免费久久久久久久久久久| 亚洲va国产va天堂va久久| 91久久精品久久国产性色也91| 国产精品欧美一区二区三区奶水| 日韩成人黄色av| 欧美大奶子在线| 日韩在线观看免费| 国产精品亚洲欧美导航| 中日韩美女免费视频网址在线观看| 久久在线免费观看视频| 日本不卡视频在线播放| 97av在线视频免费播放| 亚洲黄在线观看| 欧美高清在线视频观看不卡| 久久91精品国产91久久久| 最近2019中文字幕在线高清| 永久555www成人免费| 久久色精品视频| 亚州国产精品久久久| 久久男人av资源网站| 91高清在线免费观看| 国产91在线播放九色快色| 亚洲日本中文字幕免费在线不卡| 精品高清一区二区三区| 欧美激情视频一区二区三区不卡| 国产精品网红福利| 国产精品久久久久国产a级| 伊人久久免费视频| 国产98色在线| 亚洲精品资源美女情侣酒店| 国产精品成熟老女人| 国精产品一区一区三区有限在线| 欧美性色xo影院| 欧美激情第三页| www.日韩不卡电影av| 成人性生交xxxxx网站| 国产精品入口日韩视频大尺度| 夜夜嗨av一区二区三区免费区| 91亚洲精品在线| 成人黄色短视频在线观看| 91精品国产综合久久香蕉的用户体验| 欧美激情精品久久久| 国内免费精品永久在线视频| 亚洲欧美国产va在线影院| 黄色精品一区二区| 欧美大片在线影院| 欧美xxxx做受欧美.88| 国产日韩欧美夫妻视频在线观看| 91精品国产成人www| 色香阁99久久精品久久久| 亚洲综合中文字幕在线观看| 欧美激情在线观看视频|