Socket.Poll()用法與說明


   

Socket.Poll()

public bool Poll (

                    int microSeconds,

                    SelectMode mode

)

MSDN:

Poll 方法將會檢查 Socket 的狀態。指定 selectMode 參數的 SelectMode.SelectRead,可確定 Socket 是否爲可讀。指定 SelectMode.SelectWrite,可確定 Socket 是否爲可寫。使用 SelectMode.SelectError 檢測錯誤條件。Poll 將在指定的時段(以 microseconds 爲單位)內阻止執行。如果希望無限期的等待響應,則將 microSeconds 設置爲一個負整數。

 

int  microSeconds,

MSDN:

等待響應的時間(以微秒爲單位)。

自己理解:

是Poll程序中斷運行時間。如microseconds=1000;Poll阻塞1000毫秒,microseconds<0將無限等待響應。

2010.8.30

 

SelectMode mode

 public enum SelectMode

 {

     SelectRead = 0,  //     讀狀態模式。

     SelectWrite = 1, //     寫狀態模式。

     SelectError = 2, //     錯誤狀態模式。

 }

MSDN:

模式(SelectMode)

返回(return)

SelectRead

1.  如果已調用Listen並且有掛起的連接,則爲true。

2.如果有數據可供讀取,則爲true。

3.如果連接已關閉、重置或終止,則返回true。

SelectWrite

1.  如果正在處理Connect並且連接已成功,則爲true。

2.  如果可以發送數據,則返回true。

SelectError

1.  如果正在處理不阻止的Connect,並且連接已失敗,則爲true。

2.  如果OutOfBandInline未設置,並且帶外數據可用,則爲true。

自己理解:

只對紅色部分理解。

         2010.8.30

MSDN例子:

//Creates the Socket for sending data over TCP.

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream,

   ProtocolType.Tcp );

 

// Connects to host using IPEndPoint.

s.Connect(EPhost);

if (!s.Connected)

{

   strRetPage = "Unable to connect to host";

}

// Use the SelectWrite enumeration to obtain Socket status.

 if(s.Poll(-1, SelectMode.SelectWrite)){

      Console.WriteLine("This Socket is writable.");

 }

 else if (s.Poll(-1, SelectMode.SelectRead)){

        Console.WriteLine("This Socket is readable." );

 }

 else if (s.Poll(-1, SelectMode.SelectError)){

      Console.WriteLine("This Socket has an error.");

 }

 

自己例子:

protected override void ProcMessage()

        {

            int microSeconds = 50;

            EndPoint senderRemote = socket.RemoteEndPoint;

            int dataLen, msgLen = 0;

            try

            {

                if (socket.Poll(microSeconds, SelectMode.SelectRead))

                {

                    dataLen = ReceiveFrom(m_ReceiveBuf, m_ReceiveBuf.Length, socket);

                    if (EClass.Message.Message.Valid(m_ReceiveBuf))

                        MessageParse(m_ReceiveBuf, dataLen, (IPEndPoint)senderRemote);

                }

            }

            catch (SocketException se)

            {

                SocketError err = se.SocketErrorCode;

            }

        }

 

Socket.Select()

public static void Select (

               IList checkRead,

               IList checkWrite,

               IList checkError,

               int microSeconds

)

MSDN:

Select 是一種靜態方法,它可確定一個或多個 Socket 實例的狀態。必須先將一個或多個套接字放入 IList 中,然後才能使用 Select 方法。通過調用 Select(將 IList 作爲 checkRead 參數),可檢查是否具有可讀性。若要檢查套接字是否具有可寫性,請使用 checkWrite 參數。若要檢測錯誤條件,請使用 checkError。在調用 Select 之後,IList 中將僅填充那些滿足條件的套接字。

 

如果當前處於偵聽狀態,則可讀意味着可成功地對 Accept 進行調用而沒有阻止。如果當前已接受連接,則可讀意味着有可讀取的數據。這些情況下,所有的接收操作均可成功進行而沒有阻止。可讀性也可指示遠程 Socket 是否已經關閉連接;如果連接已關閉,則對 Receive 的調用將立即返回,並返回零字節。

 

如果至少一個相關套接字(checkRead、checkWrite 和 checkError 列表中的套接字)符合其指定的條件,或者超過 microSeconds 參數,則無論先出現其中哪種情況,都會返回 Select。將 microSeconds 設置爲 -1 會指定無限大的超時值。

 

如果對 Connect 進行非阻止調用,則可寫意味着已經成功連接。如果已經建立連接,則可寫性意味着所有的發送操作均會成功完成而沒有阻止。

 

如果對 Connect 進行非阻止調用,則 checkerror 參數將標識尚未成功連接的套接字。

 

 

自己理解:

Select是一個靜態方法。主要用於多個Socket套接字。

1.   把從客戶端接到Socket存到在ArrayList列表裏。

2.    執行Socket.Select(ArrayList,ArrayList,ArrayList,1000);會對ArrayList進行篩選,吧不符合條件的從ArraList裏刪除,留下符合條件的Socket。

2010.8.31

 

MSDN例子:

IPHostEntry ipHostEntry = Dns.Resolve(Dns.GetHostName());

            IPAddress ipAddress = ipHostEntry.AddressList[0];

 

            Socket socket0 = null;

            Socket socket1 = null;

            Socket socket2 = null;

            Socket socket3 = null;

            Socket socket4 = null;

            Socket socket5 = null;

 

            ArrayList listenList = new ArrayList();

            listenList.Add(socket0);

            listenList.Add(socket1);

            listenList.Add(socket2);

 

            ArrayList acceptList = new ArrayList();

            acceptList.Add(socket3);

            acceptList.Add(socket4);

            acceptList.Add(socket5);

 

            for (int i = 0; i < 3; i++)

            {

                listenList[i] = new Socket(AddressFamily.InterNetwork,

                                           SocketType.Stream,

                                           ProtocolType.Tcp);

                ((Socket)listenList[i]).Bind(new IPEndPoint(ipAddress, 11000 + i));

                ((Socket)listenList[i]).Listen(10);

            }

 

            // Only the sockets that contain a connection request

            // will remain in listenList after Select returns.

 

            Socket.Select(listenList, null, null, 1000);

 

            Console.Write(listenList.Count.ToString());

 

            for (int i = 0; i < listenList.Count; i++)

            {

                acceptList[i] = ((Socket)listenList[i]).Accept();

            }

            Console.Read();

 

運行以後listenList全部剔除,按理應該保留符合SelectRead條件的。

                                               2010.8.31

發佈了21 篇原創文章 · 獲贊 2 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章