标签: beginreceive

BeginReceive/BeginRead超时

我正在使用NetworkStream和TcpClient使用BeginRead异步接收数据.我需要对此操作应用超时,以便在指定的时间后读取将被中止.

据我所知,NetworkStream或TcpClient不支持 - 有一个ReceiveTimeout属性,但这似乎只适用于同步等效 - 'Read'.

甚至底层的Socket类似乎也不支持其BeginReceive方法中的超时.

我已经搜索过这个问题,我看到的唯一建议的解决方案是设置另一个后台线程来取消操作,如果它在超时期限内没有完成.这看起来像是一个可怕的黑客.当然有更好的方法吗?

asynchronous networkstream tcpclient beginread beginreceive

15
推荐指数
1
解决办法
1万
查看次数

C#Socket.BeginReceive/EndReceive

调用Socket.BeginReceive/EndReceive函数的顺序是什么?

例如,我调用BeginReceive两次,一次获取消息长度,第二次调用消息本身.现在的情况是这样的,对于我发送的每条消息,我开始等待它的完成(实际上确认发送的消息,我等待接收到确认后的动作完成),所以我用每个BeginSend调用BeginReceive,但是每个BeginReceive的回调,我检查我是否收到长度或消息.如果我收到消息并完全收到消息,那么我会调用另一个BeginReceive来接收完成的操作.现在这是事情不同步的地方.因为我的一个接收回调是接收字节,它将其解释为消息的长度,实际上它是消息本身.

现在我该如何解决?

编辑:这是一个C#.NET问题:)

这是代码,基本上它太大了,对不起

public void Send(string message)
{
    try
    {
        bytesSent = 0;

        writeDataBuffer = System.Text.Encoding.ASCII.GetBytes(message);
        writeDataBuffer = WrapMessage(writeDataBuffer);
        messageSendSize = writeDataBuffer.Length;

        clientSocket.BeginSend(writeDataBuffer, bytesSent, messageSendSize, SocketFlags.None,
                            new AsyncCallback(SendComplete), clientSocket);
    }
    catch (SocketException socketException)
    {
        MessageBox.Show(socketException.Message);
    }
}

public void WaitForData()
{
    try
    {
        if (!messageLengthReceived)
        {
            clientSocket.BeginReceive(receiveDataBuffer, bytesReceived, MESSAGE_LENGTH_SIZE - bytesReceived,
                                    SocketFlags.None, new AsyncCallback(RecieveComplete), clientSocket);
        }
}

public void Send(string message)
{
    try
    {
        bytesSent = 0; …
Run Code Online (Sandbox Code Playgroud)

.net c# sockets beginreceive

9
推荐指数
3
解决办法
5万
查看次数

如何在循环中使用UdpClient.BeginReceive

我想做这个

for (int i = 0; i < 100; i++ )
{
    Byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
}
Run Code Online (Sandbox Code Playgroud)

UdpClient.Receive我不得不使用,而不是使用UdpClient.BeginReceive.问题是,我该怎么做?没有很多样本使用BeginReceive,MSDN示例根本没有帮助.我应该使用BeginReceive,还是只在一个单独的线程下创建它?

我一直都是ObjectDisposedException例外.我只收到第一个发送的数据.下一个数据将抛出异常.

public class UdpReceiver
{
    private UdpClient _client;
    public System.Net.Sockets.UdpClient Client
    {
        get { return _client; }
        set { _client = value; }
    }
    private IPEndPoint _endPoint;
    public System.Net.IPEndPoint EndPoint
    {
        get { return _endPoint; }
        set { _endPoint = value; }
    }
    private int _packetCount;
    public int PacketCount
    {
        get …
Run Code Online (Sandbox Code Playgroud)

c# udpclient beginreceive

8
推荐指数
2
解决办法
2万
查看次数

无法附加到UDP侦听器C#中的接收字符串

我有一个创建UDP对象的Form,在UDP类中创建UDPClient,并使用EndReceive在BeginReceive方法中完成接收的数据.

当我打印所提供数据的字符串后,在转换byte []之后,从beginreceive方法中添加文本,只有接收的数据不打印附加的文本.

所以看起来收到的数据不完整.

打印字符串时,不显示NewLine和附加的"done".

任何帮助都会很棒!!

谢谢

class Udp
{
    public EventHandler _dataReceived;

    public Udp()
    {

        int receiverPort = 1248;
        UdpClient receiver = new UdpClient(receiverPort);

        string discovery = "<?xml version=\"1.0\"?><ServiceQuery></ServiceQuery>";

        receiver.BeginReceive(new AsyncCallback( DataReceived), receiver);

        IPEndPoint end = new IPEndPoint(IPAddress.Broadcast, 1248);
        receiver.Send(Encoding.ASCII.GetBytes(discovery + "\0"), discovery.Length + 1, end);
}

private void DataReceived(IAsyncResult ar)
{
    UdpClient c = (UdpClient)ar.AsyncState;
    IPEndPoint receivedIpEndPoint = new IPEndPoint(IPAddress.Any, 1248);

    Byte[] receivedBytes = c.EndReceive(ar, ref receivedIpEndPoint);

    string receivedText = ASCIIEncoding.ASCII.GetString(receivedBytes);

    Console.WriteLine("\n");

    if(_dataReceived != null)
    {
        Console.Write(receivedIpEndPoint + …
Run Code Online (Sandbox Code Playgroud)

string multithreading asynchronous udp beginreceive

6
推荐指数
1
解决办法
148
查看次数

如何在异步套接字中接收完整的屏幕截图?

我有一个Java android代码,它将数据(图像或文本)发送到C#应用程序,以接收我正在使用异步套接字的这些数据。但是存在一个与BeginReceive()功能有关的问题,就是在发送图像时没有接收到完整的数据。那么,如何使一种“循环”来接收完整的数据并在Picturebox上显示图像之后(例如)?

形成

private Listener listener;
private Thread startListen;

private Bitmap _buffer;

public frmMain()
{
  InitializeComponent();
}

private void serverReceivedImage(Client client, byte[] image)
{
    try
    {
        byte[] newImage = new byte[image.Length - 6];

        Array.Copy(image, 6, newImage, 0, newImage.Length);

            using (var stream = new MemoryStream(newImage))
            {
                using (var msInner = new MemoryStream())
                {

                  stream.Seek(2, SeekOrigin.Begin);

                  using (DeflateStream z = new DeflateStream(stream, CompressionMode.Decompress))
                  {
                    z.CopyTo(msInner);
                  }

                  msInner.Seek(0, SeekOrigin.Begin);

                  var bitmap = new Bitmap(msInner); …
Run Code Online (Sandbox Code Playgroud)

c# asyncsocket beginreceive

6
推荐指数
0
解决办法
237
查看次数

.NET异步MSMQ

我不明白这是怎么回事.基本上,我有一个程序从消息队列接收并处理消息.程序可以随时停止,在这种情况下,消息循环在程序退出之前完成它正在执行的操作.我正在尝试使用以下代码完成此操作:

private MessageQueue q;
private ManualResetEventSlim idle;

public void Start()
{
    idle = new ManualResetEventSlim();
    q.ReceiveCompleted += this.MessageQueue_ReceiveCompleted;    
    q.BeginReceive();
}    

public void Stop()
{ 
    this.q.Dispose();
    this.idle.Wait();    
}

private void MessageQueue_ReceiveCompleted(object sender, 
    ReceiveCompletedEventArgs e)
{
    Message inMsg;
    try
    {
        inMsg = e.Message;
    }
    catch (Exception ex)
    {
        this.idle.Set();
        return;
    }

    // Handle message

    this.q.BeginReceive();
}
Run Code Online (Sandbox Code Playgroud)

正如希望显而易见的那样,Stop方法处理消息队列,然后等待设置空闲等待句柄(这应该在处理时调用ReceiveCompleted事件时发生,但e.Message属性应该除外).

但是,消息循环只是继续!我已经处理了消息队列,但它仍然设法从中读取并且不调用异常处理程序,这意味着idle.Wait行永远等待.

我的理解是,处理消息队列应该结束任何挂起的接收并调用该事件,但是e.Message(或q.EndReceive)应该抛出异常.这不是这种情况吗?如果没有,我还能如何安全地退出我的消息循环?

谢谢

更新:

这是一个完整的例子(假设队列存在)

class Program
{
    static MessageQueue mq;
    static ManualResetEventSlim idleWH;

    static void Main(string[] args)
    {
        idleWH = new ManualResetEventSlim();

        Console.WriteLine("Opening...");
        using …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous msmq beginreceive

5
推荐指数
1
解决办法
7101
查看次数