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