Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以将BeginConnect与Socket的同步发送和接收方法一起使用?_C#_Sockets_Tcp - Fatal编程技术网

C# 是否可以将BeginConnect与Socket的同步发送和接收方法一起使用?

C# 是否可以将BeginConnect与Socket的同步发送和接收方法一起使用?,c#,sockets,tcp,C#,Sockets,Tcp,我使用类套接字进行通信。首先我使用了连接方法,套接字的发送和接收方法。但稍后我应该设置连接超时。根据这篇文章,我使用BeginConnect,但在那之后,我的Receive给了我时间 可以同时使用BeginConnect、Send和receive吗?同步和异步连接/发送/接收方法可以混合使用。但你必须注意不要同时打两个电话,比如先连接BeginnConnect,然后直接尝试使用Receive 您可以使用IAsyncResult确定异步调用是否已完成 此示例在同一台pc上使用tcp echo服务器

我使用类套接字进行通信。首先我使用了连接方法,套接字的发送和接收方法。但稍后我应该设置连接超时。根据这篇文章,我使用BeginConnect,但在那之后,我的Receive给了我时间


可以同时使用BeginConnect、Send和receive吗?

同步和异步连接/发送/接收方法可以混合使用。但你必须注意不要同时打两个电话,比如先连接BeginnConnect,然后直接尝试使用Receive

您可以使用IAsyncResult确定异步调用是否已完成

此示例在同一台pc上使用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()
,因为它会阻止当前线程,直到异步连接完成,如果要在不同的线程上连接/发送/接收,则必须自己管理此连接状态