如何创建C#Compact Framework非阻塞套接字

时间:2011-04-18 22:33:43

标签: c# sockets compact-framework

我正在尝试在WM6 C#中创建一个非阻塞套接字,但我不断收到以下编译器错误:

“非阻塞套接字不支持同步调用。设置阻塞= true或使用异步方法。”

但是当我使用BeginReceive()异步方法时,EndReceive()被阻止。对于BeginSend()和EndSend()也是如此。你如何在紧凑的框架内做一个非阻塞套接字?

这是我的代码。我没有使用AsyncCallback方法,因为我想返回bytesRecv和bytesSent变量。

    private void asyncReceive(byte[] recvBytes, int offset, int size, SocketFlags sf)
    {
        IAsyncResult asyncResult = null;
        int recvBytes = 0;

        try
        {
            asyncResult = _socket.BeginSend(sendBytes, offset, size, sf, null, null);
            recvBytes = _socket.EndSend(asyncResult);  // <-- This blocks even with _socket.Blocking = false;
        }
        catch (SocketException)
        {
            //Check SocketException.ErrorCode...
        }

        return recvBytes;
    }  

1 个答案:

答案 0 :(得分:2)

看起来你错过了这一点 - 你所看到的行为是设计的。我建议阅读.NET中的异步编程(很多资源 - 可能会启动here)。使用BeginXXX进行非阻塞套接字读/写将允许您启动发送/接收,然后执行其他操作并在内核完成后通知(通过AsyncCallback),此时您将调用相应的EndXXX方法得到结果。如果在操作完成之前在BeginXXX调用之后立即调用EndXXX,则设计为阻止直到完成。

要获得非阻塞行为,您需要稍微分解代码以正确处理回调(例如,将结果封送回UI,无论如何)。在底层内核位实际完成之前,您将无法得到发送/接收的字节数。