利用Socket异步连接远程,发出异步连接请求后,在连不上的情况下,等待的时间比较长,WinForm卡在那里不动了,我这样改代码正确吗?该如何写呢?代码如下: _client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(_ip), _port);
_client.Ttl = 10;//这句有效吗?
_client.BeginConnect(ipep, new AsyncCallback(ConnectCallback), _client);
_connectDone.WaitOne(100, true);//第二个参数该用false还是用true
//连接成功后,异步发送数据
......
谢谢指点!
_client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(_ip), _port);
_client.Ttl = 10;//这句有效吗?
_client.BeginConnect(ipep, new AsyncCallback(ConnectCallback), _client);
_connectDone.WaitOne(100, true);//第二个参数该用false还是用true
//连接成功后,异步发送数据
......
谢谢指点!
public virtual bool WaitOne (
int millisecondsTimeout,
bool exitContext
)参数
millisecondsTimeout
等待的毫秒数,或为 Timeout.Infinite (-1),表示无限期等待。 exitContext
为 true,则等待之前先退出上下文的同步域(如果在同步上下文中),然后在稍后重新获取它;否则为 false。 这个参数不理解,能具体说一下吗?返回值
如果当前实例收到信号,则为 true;否则为 false。
用false就好了
_client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(_ip), _port);
_client.Ttl = 10;//这句有效吗?
IAsyncResult ias= _client.BeginConnect(ipep, new AsyncCallback(ConnectCallback), _client);
int i = System.Environment.TickCount;
//timeout 1000ms
int timeout=1000;
while (System.Environment.TickCount - i <= timeout)
{
if (_client.Connected == true)
{
MessageBox.Show("connected success!");
break;
}
Application.DoEvents();
} if (_client.Connected == false)
{
ias.AsyncWaitHandle.WaitOne(0, false);
MessageBox.Show("connected timeout");
}你那个程式在运行时在连接的过程中界面仍然会没响应的。
那你何必写什么 BeginConnect 呢,同步Connect不就行了?画蛇添足了。