- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经习惯了同步套接字,但为了达到现在的状态,我有些头疼,尤其是在 Socket.Receive(..)
并不总是接收到所有字节的情况下
这是我以前使用的代码
public byte[] Receive(int size)
{
var buffer = new byte[size];
var r = 0;
do
{
// ReSharper disable once InconsistentlySynchronizedField
var c = _clientSocket.Receive(buffer, r, size - r, SocketFlags.None);
if (c == 0)
{
throw new SocketExtendedException();
}
r += c;
} while (r != buffer.Length);
return buffer;
}
现在我开始在 Windows Phone 中使用套接字,但是 .Receive(..)
不可用,我设法让 Socket.ReceiveAsync(..)
工作但是我很担心(到目前为止没有发生任何问题)这是我的新代码,我没有实现检查是否已收到所有字节,也不知道我是否必须使用以下代码
private byte[] ReadBySize(int size = 4)
{
var readEvent = new AutoResetEvent(false);
var buffer = new byte[size];
var recieveArgs = new SocketAsyncEventArgs()
{
UserToken = readEvent
};
recieveArgs.SetBuffer(buffer, 0, size);
recieveArgs.Completed += recieveArgs_Completed;
_connecter.ReceiveAsync(recieveArgs);
readEvent.WaitOne();
if (recieveArgs.BytesTransferred == 0)
{
if (recieveArgs.SocketError != SocketError.Success)
throw new SocketException((int)recieveArgs.SocketError);
throw new CommunicationException();
}
return buffer;
}
void recieveArgs_Completed(object sender, SocketAsyncEventArgs e)
{
var are = (AutoResetEvent)e.UserToken;
are.Set();
}
这是我第一次使用 ReceiveAsync
谁能指出我可能做错的或需要更改的地方
最佳答案
好吧,我去拿了一个大缓冲区并分批发送,中间有一个 sleep 间隔以复制“并非所有字节都收到”所以我上面的代码没有收到所有字节。对于那些也使用 ReceiveAsync(..) 的人,这里是我的有效代码
private byte[] ReadBySize(int size = 4)
{
var readEvent = new AutoResetEvent(false);
var buffer = new byte[size]; //Receive buffer
var totalRecieved = 0;
do
{
var recieveArgs = new SocketAsyncEventArgs()
{
UserToken = readEvent
};
recieveArgs.SetBuffer(buffer, totalRecieved, size - totalRecieved);//Receive bytes from x to total - x, x is the number of bytes already recieved
recieveArgs.Completed += recieveArgs_Completed;
_connecter.ReceiveAsync(recieveArgs);
readEvent.WaitOne();//Wait for recieve
if (recieveArgs.BytesTransferred == 0)//If now bytes are recieved then there is an error
{
if (recieveArgs.SocketError != SocketError.Success)
throw new ReadException(ReadExceptionCode.UnexpectedDisconnect,"Unexpected Disconnect");
throw new ReadException(ReadExceptionCode.DisconnectGracefully);
}
totalRecieved += recieveArgs.BytesTransferred;
} while (totalRecieved != size);//Check if all bytes has been received
return buffer;
}
void recieveArgs_Completed(object sender, SocketAsyncEventArgs e)
{
var are = (AutoResetEvent)e.UserToken;
are.Set();
}
我使用 Socket 应用程序的方式是发送一个包含一些变量的 Buffer
[0] -> 0,1,2 0 is keep alive, 1 means there are data, 2 means a type off error occured
[1,2,3,4] size of the actual buffer I am sending
[x(size of 1,2,3,4)] the actual 'Serialized' data buffer
关于C# 套接字 ReceiveAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32176826/
有没有办法使用 Microsoft.Azure.ServiceBus 包来等待当前线程从队列接收消息? 这可能更多是我的理解和以不打算使用的方式使用该技术的愿望的问题,但我想做的是结合 the fol
我已经习惯了同步套接字,但为了达到现在的状态,我有些头疼,尤其是在 Socket.Receive(..) 并不总是接收到所有字节的情况下 这是我以前使用的代码 public byte[] Re
我目前正在开发一个应用程序服务器。我想使用 AcceptAsync 方法。我收到错误消息“对象引用未设置为对象的实例。”调用 ReceiveAsync 方法时。如果有人提出这个问题并得到解决方案? p
我需要为一些旧的 cobol 重新实现数据库连接驱动程序我的一位客户的数据库。应用程序的构建方式,我无法使用async/await (就这样吧,我知道这很愚蠢)。 整个应用程序是一个 ASP.NET
我有一个基于异步Socket的长时间运行的服务程序。当其他设备检测到它的运行状况(短时间 TCP 端口连接和断开连接)时,它的内存使用量会随着时间的推移而不断增加。我怀疑这种类型的 TCP 连接的一些
美好的一天。我使用 UdpClient 并对其进行包装。 为了阅读我有异步方法: private async Task Receive(UdpClient client, CancellationTo
当使用异步套接字时,特别是 Socket.ReceiveAsync,是否可以进行“部分”接收?例如,我想指定我希望 SocketAsyncEventArgs 对象有 1024 个字节,但我只想允许接收
在读取已接收到的少量数据时,我尝试比较同步方法和异步方法的性能。所以我发送数据并确保它正在等待接收套接字(相同的程序)。 source.Send(sendBuffer); while (target.
我打算通过套接字接收数据包,但由于它们是从发送方以高频率发送的,所以它们中的许多被打包到一个 byte 数组中。 SocketAsyncEventArgs.Buffer 然后保存多个数据包,即使它们是
似乎在使用 SslStream 时我无法获得 ReceiveAsync 的好处,因为我必须通过仅支持 Begin* End* 异步模型的 SslStream 进行读取。 是否可以在完成身份验证之前只使
我看过 TCP 的 ReceiveAsync 示例,但没有看过 UDP。 ReceiveAsync 是否与 UDP 兼容?如果是这样,您看到过任何示例吗? 谢谢。 最佳答案 UDP 是面向数据报的协议
我正在使用如下所示的 UDPClient dim c = New UDPClient(port) client.CLient.ReceiveTimeout = 1 await client.Recei
我正在测试以下两种情况,一种有效,但另一种无效。我有套接字服务器和套接字客户端应用程序在两台不同的机器上运行 这两个场景都使用了 socketasynceventargs 场景 1(有效)循环创建 4
服务工作线程有两种方法处理来自 Azure 服务总线队列的消息: while (!ExitRequested) { try { var message = await
我有这段代码通过 UdpClient 发送命令,然后等待响应: cameraListener = new UdpClient(52381); cameraSender = new UdpCl
我正在使用 .NET 4.5.1 运行 C# 控制台应用程序。当我运行以下函数时,下面的 udpClient.ReceiveAsync() 调用会无一异常(exception)地静默终止程序。我该如何
我正在通过 websocket 接收 JSON。至少:我是部分的。使用在线 websocket 服务,我收到完整的 JSON 响应(所有 HTML 标记都被忽略)。当我查看在控制台中收到的 JSON
我目前正在编写一个客户端应用程序,我想知道我是否应该使用 Socket 类的 ReceiveAsync 或 BeginReceive 方法。到目前为止,我一直在使用后者,但是,我发现它似乎对 CPU
我有一个接口(interface) INetwork用一个方法: Task SendAsync(string messageToSend, CancellationToken ct) 接口(inter
我正在编写一个只使用一个套接字的简单套接字客户端。所以我想我可以为所有接收操作重用一个 SocketAsyncEventArgs。只要连接了 socket ,它就可以正常工作。当服务器断开连接时,客户
我是一名优秀的程序员,十分优秀!