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