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將無限等待響應。

 

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;

            }

        }

 原文地址:http://blog.sina.com.cn/s/blog_43eee55a0100l87i.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM