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

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

C#-Socket監聽消息處理

2019-11-10 20:34:50
字體:
來源:轉載
供稿:網友

搬運整合三個使用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
亚洲аv电影天堂网| 国产日本欧美一区| 成人有码在线播放| 亚洲人成在线观看| 粉嫩老牛aⅴ一区二区三区| 97视频在线观看播放| 久久国产精品亚洲| 国产精品盗摄久久久| 性色av香蕉一区二区| 亚洲春色另类小说| 亚洲色无码播放| 国产精品影院在线观看| 国产一区在线播放| 久久频这里精品99香蕉| 日本精品视频在线观看| 不卡伊人av在线播放| 亚洲色图综合网| 欧美香蕉大胸在线视频观看| 永久免费精品影视网站| 国产精品国产自产拍高清av水多| 国产日韩精品在线| 国产精品久久久久秋霞鲁丝| 久久香蕉国产线看观看av| 国产91在线视频| 亚洲男人天堂视频| 久久久视频在线| 7m精品福利视频导航| www.亚洲一区| 亚洲性生活视频| 国产精品自产拍在线观看中文| 欧美精品videos另类日本| 91国偷自产一区二区三区的观看方式| 一区二区三区视频在线| 欧美激情2020午夜免费观看| 欧美亚洲成人免费| 裸体女人亚洲精品一区| 国产免费久久av| 国产精品一区二区性色av| 欧美刺激性大交免费视频| 久久久久久久久久久国产| 国产精品999| 久久手机免费视频| 欧美大片免费观看| 欧洲成人在线视频| 尤物yw午夜国产精品视频| 欧美性开放视频| 91色p视频在线| 国产日本欧美一区二区三区在线| 欧美激情影音先锋| 日韩一区二区av| 日韩福利在线播放| 欧美裸体xxxx极品少妇软件| 欧美性猛交xxxx偷拍洗澡| 久久久91精品国产一区不卡| 欧美激情视频在线免费观看 欧美视频免费一| 不卡伊人av在线播放| 国产丝袜高跟一区| 亚洲日韩中文字幕| 97超级碰碰碰| 亚洲国产小视频| 日韩二区三区在线| 国模私拍视频一区| 伦伦影院午夜日韩欧美限制| 亚洲免费一级电影| 亚洲天堂久久av| 国产999精品久久久| 欧美日韩国产综合视频在线观看中文| 亚洲欧美制服另类日韩| www.日韩欧美| 中文字幕成人精品久久不卡| 欧美精品日韩三级| 97视频在线观看亚洲| 日韩美女免费观看| 中文字幕av日韩| 日韩有码在线视频| 欧美成人精品在线视频| 欧美大成色www永久网站婷| 97久久久免费福利网址| 日韩中文字幕在线视频播放| 亚洲品质视频自拍网| 欧美成人四级hd版| 久久久91精品国产一区不卡| 国产在线观看精品一区二区三区| 欧美午夜性色大片在线观看| 亚洲国产成人精品女人久久久| 成人情趣片在线观看免费| 成人免费福利视频| 久久久免费av| 欧美在线观看日本一区| 久久精品视频99| 中文字幕亚洲一区在线观看| 中文字幕日韩av综合精品| 欧美日韩亚洲精品内裤| 欧美国产一区二区三区| 欧美日韩国产一区二区三区| zzjj国产精品一区二区| 国产亚洲综合久久| 精品国内产的精品视频在线观看| 国产精品第一视频| 亚洲大尺度美女在线| 欧美日本国产在线| 久久久久久亚洲| 丝袜美腿亚洲一区二区| 久久伊人精品天天| 亚洲男人第一网站| 亚洲国产成人久久| 亚洲精品98久久久久久中文字幕| 国色天香2019中文字幕在线观看| 国产成人精品一区二区| 一区二区欧美亚洲| 97超碰蝌蚪网人人做人人爽| 亚洲国产小视频在线观看| 国产欧洲精品视频| 久久99青青精品免费观看| 超碰97人人做人人爱少妇| 久久精品视频播放| 亚洲人成电影网站色…| 国产美女久久久| 久久视频在线直播| 日韩免费观看在线观看| 成人午夜在线影院| 国产精品无码专区在线观看| 亚洲一区二区三区在线免费观看| 久久国产精彩视频| 亚洲一区二区在线播放| 日韩av不卡电影| 国产精品久久久一区| 日韩av一区二区在线观看| 国产欧美精品一区二区三区-老狼| 久久精品亚洲94久久精品| 一区二区亚洲精品国产| 亚洲精品一区中文| 91精品国产自产在线| 国产中文字幕日韩| 国产在线观看不卡| 日韩最新av在线| 一区二区三区精品99久久| 欧美国产日韩视频| 国产一区二区精品丝袜| 91亚洲永久免费精品| 久久精品视频网站| 国产精品嫩草影院久久久| 在线观看91久久久久久| 欧美视频中文字幕在线| 日韩免费观看网站| 日韩的一区二区| 精品成人国产在线观看男人呻吟| 久久久久国色av免费观看性色| 日韩视频免费中文字幕| 成人黄色免费在线观看| 日韩在线观看网站| 色噜噜国产精品视频一区二区| 日韩在线小视频| 久久久久在线观看| 欧美色另类天堂2015| 亚洲www永久成人夜色| 91精品久久久久久久久久入口| 午夜精品蜜臀一区二区三区免费| 国产精品第一视频| 亚洲成人激情在线| 人人爽久久涩噜噜噜网站| 欧美高清videos高潮hd| 国产主播欧美精品| 亚洲xxxxx电影|