您的位置:首页 > 其它

Socket.Poll()用法与说明

2014-12-11 19:33 344 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: