可以将 BeginConnect 与 Socket 的同步发送和接收方法一起使用吗?
Is possible to use BeginConnect with sync Send and Receive methods of Socket?
我使用class 套接字进行通信。一开始我用的是Socket的Connect方法,Send和Receive方法。但稍后我应该将超时设置为连接。根据此 post How to configure socket connect timeout 我使用了 BeginConnect,但之后我的 Receive 超时了。
是否可以同时使用 BeginnConnect、发送和接收?
同步和异步 Connect/Send/Receive 方法可以混合使用。但是你必须注意不要同时进行 2 个调用,比如使用 BeginnConnect 连接然后直接尝试使用 Receive。
您可以使用 IAsyncResult 来确定异步调用是否已完成。
这个例子没有问题,在同一台电脑上使用 tcp echo 服务器:
Socket myAsyncConnectSocket = new Socket(SocketType.Stream, ProtocolType.Tcp);
myAsyncConnectSocket.ReceiveTimeout = 10;
myAsyncConnectSocket.SendTimeout = 10;
int connectTimeout = 10;
var asyncResult = myAsyncConnectSocket.BeginConnect(
new IPEndPoint(IPAddress.Loopback, 57005), null, null);
bool timeOut = true;
if (asyncResult.AsyncWaitHandle.WaitOne(connectTimeout))
{
timeOut = false;
Console.WriteLine("Async Connected");
try
{
myAsyncConnectSocket.Send(Encoding.ASCII.GetBytes("Test 1 2 3"));
Console.WriteLine("Sent");
byte[] buffer = new byte[128];
myAsyncConnectSocket.Receive(buffer);
Console.WriteLine("Received: {0}", Encoding.ASCII.GetString(buffer));
}
catch (SocketException se)
{
if (se.SocketErrorCode == SocketError.TimedOut) timeOut = true;
else throw;
}
}
Console.WriteLine("Timeout occured: {0}", timeOut);
请特别注意 asyncResult.AsyncWaitHandle.WaitOne()
,因为它会阻塞当前线程,直到异步连接完成,如果您想 connect/send/receive 在不同的线程上,您必须自己管理此连接状态。
我使用class 套接字进行通信。一开始我用的是Socket的Connect方法,Send和Receive方法。但稍后我应该将超时设置为连接。根据此 post How to configure socket connect timeout 我使用了 BeginConnect,但之后我的 Receive 超时了。
是否可以同时使用 BeginnConnect、发送和接收?
同步和异步 Connect/Send/Receive 方法可以混合使用。但是你必须注意不要同时进行 2 个调用,比如使用 BeginnConnect 连接然后直接尝试使用 Receive。
您可以使用 IAsyncResult 来确定异步调用是否已完成。
这个例子没有问题,在同一台电脑上使用 tcp echo 服务器:
Socket myAsyncConnectSocket = new Socket(SocketType.Stream, ProtocolType.Tcp);
myAsyncConnectSocket.ReceiveTimeout = 10;
myAsyncConnectSocket.SendTimeout = 10;
int connectTimeout = 10;
var asyncResult = myAsyncConnectSocket.BeginConnect(
new IPEndPoint(IPAddress.Loopback, 57005), null, null);
bool timeOut = true;
if (asyncResult.AsyncWaitHandle.WaitOne(connectTimeout))
{
timeOut = false;
Console.WriteLine("Async Connected");
try
{
myAsyncConnectSocket.Send(Encoding.ASCII.GetBytes("Test 1 2 3"));
Console.WriteLine("Sent");
byte[] buffer = new byte[128];
myAsyncConnectSocket.Receive(buffer);
Console.WriteLine("Received: {0}", Encoding.ASCII.GetString(buffer));
}
catch (SocketException se)
{
if (se.SocketErrorCode == SocketError.TimedOut) timeOut = true;
else throw;
}
}
Console.WriteLine("Timeout occured: {0}", timeOut);
请特别注意 asyncResult.AsyncWaitHandle.WaitOne()
,因为它会阻塞当前线程,直到异步连接完成,如果您想 connect/send/receive 在不同的线程上,您必须自己管理此连接状态。