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

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

C#-Socket監聽消息處理

2019-11-10 18:12: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一区| 亚洲free嫩bbb| 久久6免费高清热精品| 欧美精品在线免费| 亚洲一区二区久久久久久久| zzijzzij亚洲日本成熟少妇| 久久频这里精品99香蕉| 91久久久久久久久久久| 色av吧综合网| 亚洲free性xxxx护士白浆| 夜夜狂射影院欧美极品| 亚洲天堂免费视频| 最新亚洲国产精品| 亚洲国产成人精品一区二区| 国产欧美日韩精品在线观看| 7m第一福利500精品视频| 在线色欧美三级视频| 77777少妇光屁股久久一区| 精品国偷自产在线视频| 欧美在线日韩在线| 久久深夜福利免费观看| 色综合亚洲精品激情狠狠| 欧美一乱一性一交一视频| 亚洲free性xxxx护士hd| 亚洲欧美日韩精品| 欧美色道久久88综合亚洲精品| 欧美老肥婆性猛交视频| 久久久久久久国产精品视频| 亚洲人成电影网站色xx| 国产精品xxx视频| 日韩在线观看精品| 欧美电影免费观看| 91中文在线观看| 97精品久久久中文字幕免费| 日韩最新中文字幕电影免费看| 国产亚洲精品综合一区91| 成人激情视频在线| 亚洲aaaaaa| 午夜精品在线视频| 欧美精品一本久久男人的天堂| 97久久国产精品| 成人免费在线视频网站| 69国产精品成人在线播放| 日韩欧美中文字幕在线播放| 亚洲第一精品夜夜躁人人爽| 夜夜嗨av一区二区三区免费区| 欧美成人免费在线观看| 久久精品国产一区二区三区| 国产成人精品av| 久久久中精品2020中文| 日韩毛片在线看| 亚洲欧美精品suv| 欧美成人手机在线| 欧美在线性爱视频| 91精品久久久久久久久不口人| 疯狂做受xxxx欧美肥白少妇| 久久亚洲精品一区二区| 77777少妇光屁股久久一区| 亚洲精品久久久一区二区三区| 日韩精品在线第一页| 欧美成人四级hd版| 2019中文在线观看| 国产日韩视频在线观看| 国产亚洲一区二区在线| 国产成人在线播放| 久久精品最新地址| 成人免费视频在线观看超级碰| 国产免费一区二区三区在线能观看| 美日韩丰满少妇在线观看| 欧美性xxxx| 狠狠色噜噜狠狠狠狠97| 日韩在线播放一区| 中文国产成人精品| 黑人狂躁日本妞一区二区三区| 精品香蕉一区二区三区| 国产成人av网址| 成人黄色片在线| 色多多国产成人永久免费网站| 久久久久久久影院| 精品中文字幕在线2019| 美日韩精品免费视频| 久久精品夜夜夜夜夜久久| 久久91超碰青草是什么| 久久99视频免费| 欧美午夜视频在线观看| 国产精品免费一区| 欧美丰满少妇xxxxx| 亚洲精品久久久久中文字幕欢迎你| 成人中文字幕在线观看| 日本成人激情视频| 久久99精品视频一区97| 欧美日韩不卡合集视频| 亚洲男人天堂久| 国产精品美女在线| 亚洲欧美成人精品| 色悠久久久久综合先锋影音下载| 精品日本高清在线播放| 欧美日韩亚洲激情| 最近中文字幕mv在线一区二区三区四区| 国产97色在线| 国产玖玖精品视频| 久久视频在线观看免费| 按摩亚洲人久久| 日韩在线视频国产| 日本a级片电影一区二区| 日韩精品免费看| 成人免费高清完整版在线观看| 亚洲精品一区在线观看香蕉| 上原亚衣av一区二区三区| 韩剧1988免费观看全集| 久久九九热免费视频| 亚洲国产精品久久久久久| 色综合色综合久久综合频道88| 亚洲欧美在线第一页| 久久亚洲精品一区| 国产精品专区一| 日韩av影片在线观看| 国产亚洲欧美日韩精品| 亚洲人成电影在线播放| 成人美女免费网站视频| 久久精品夜夜夜夜夜久久| 国产精品夫妻激情| 中文字幕免费精品一区| 久久精品国产久精国产思思| 亚洲福利视频免费观看| 日韩av综合网站| 亚洲欧美国产日韩中文字幕| 国内精品久久影院| 中文字幕欧美日韩va免费视频| 午夜精品福利视频| 国产有码在线一区二区视频| 国内精久久久久久久久久人| 欧美激情欧美激情在线五月| 国产精品私拍pans大尺度在线| 亚洲第一视频网站| 欧美激情videoshd| 午夜精品一区二区三区在线| 国产精品久久999| 日韩在线观看免费全| 日韩美女av在线| 北条麻妃在线一区二区| 欧美性理论片在线观看片免费| 亚洲电影第1页| 91九色在线视频| 亚洲国产精品久久久久久| 91经典在线视频| 国产视频精品va久久久久久| 久久久av网站| 亚洲欧美三级伦理| 亚洲欧洲激情在线| 日韩精品在线视频观看| 欧美性猛交xxxx免费看久久久| 欧美成人亚洲成人日韩成人| 亚洲人成电影网站色www| 成人国产在线激情| 中文字幕亚洲二区| 国产精品久久久久77777| 中文字幕免费精品一区高清| 久久深夜福利免费观看| 欧美性受xxxx黑人猛交| 亚洲人线精品午夜| 欧美国产激情18| 亚洲精品99久久久久中文字幕| 欧美日韩亚洲一区二区三区|