c# - Socket接收数据时设置ReceiveTimeout

标签 c# sockets

我有一个使用 Socket 的客户端,其接收数据的代码如下。

/** Some Code Above **/
private static ManualResetEvent receiveDone = new ManualResetEvent(false);
byte[] receivedBytes = new byte[65535];
String msg = null;

public String ReceiveMessage() {
    csocket.BeginReceive(receivedBytes, 0, receivedBytes.Length, SocketFlags.None, new AsyncCallback(receiveCallback), csocket);
    receiveDone.WaitOne();
    return msg;
}

private void receiveCallback(IAsyncResult ar){
    try{
        Socket socket = (Socket)ar.AsyncState;
        socket.ReceiveTimeout = 10000;  /**** Not  Working ****/
        int received = socket.EndReceive(ar);
        byte[] dataBuf = new byte[received];
        Array.Copy(receivedBytes, dataBuf, received);
        msg = (Encoding.ASCII.GetString(dataBuf)); 
        Console.WriteLine("Message Received: " + msg);
        receiveDone.Set();
    }catch (SocketException e){
        if (e.SocketErrorCode == SocketError.TimedOut){
            Console.WriteLine("SocketExecption => Timeout");
        }else{
            Console.WriteLine("SocketExecption => " + e.ToString());
        }
    }catch (Exception e){
        Console.WriteLine("Execption => " + e.ToString());
    }
}

数据正在接收,但我已将 ReceiveTimeout 设置为 10000,但它不起作用。我是否将 ReceiveTimeout 放在了错误的行中?如果是这样,那么我应该在哪里初始化 ReceiveTimeout?

我发现下面的代码中设置了 ReceiveTimeout 并且可以正常工作,但我更喜欢使用 BeginReceive() 方法。

try{
    byte[] byt = new byte[65535];
    socket.ReceiveTimeout = 10000;
    socket.Receive(byt);
    Console.WriteLine("Message: " + Encoding.UTF8.GetString(byt));
}catch (SocketException e){
    if (e.SocketErrorCode == SocketError.TimedOut)
    {
        Console.WriteLine("TimeOut");
    }else{
        Console.WriteLine("Unknown SocketExecption: " + e.ToString());
    }
}catch (Exception e){
    Console.WriteLine("Unknown Exception:" + e.ToString());
}

这让我在设置 ReceiveTimeout 时感到困惑。

最佳答案

可能重复: How to handle timeout in Async Socket?

ReceiveTimeout 不适用于异步调用。建议的解决方案是使用自己的计时器。

来自 Socket.ReceiveTimeout 的 msdn :

This option applies to synchronous Receive calls only. If the time-out period is exceeded, the Receive method will throw a SocketException.

关于c# - Socket接收数据时设置ReceiveTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39762379/

相关文章:

c# - 更改 DataGrid Cell WPF 关于范围的颜色

c# - 如何以最高性能复制对象

C TCP套接字无法接收文件

php - socket.io 轮询返回 Laravel 500 NotFoundHttpException

java - Graphite 服务器不显示从 Java 发送的新数据

python - TCP 服务器从客户端接收数据有时不工作

c# - 通过 ASP.NET 按钮在 aspx 页面中导航 anchor 标记

c# - 如何使用元素序列作为目标正确搜索和解析数组

c# - 我如何为公共(public)接口(interface)类型编写我自己的装饰器实用程序(动态代理如何工作)?

php - 具有Flash客户端的PHP套接字服务器