如何指定使用Socket.SendToAsync()时要发送的字节数?

时间:2013-08-04 10:47:44

标签: c# sockets .net-4.0 udp system.net

我已将基于UDP的协议实现从使用Socket.BeginXXX方法移植到Socket.XXXAsync方法,因为它们采用具有Buffer,Offset和Count属性的SocketAsyncEventArgs类,因此可以分割单个大缓冲区并用于每个操作。

不幸的是我刚刚发现了设置:

mySocketAsyncEventArgs.SendPacketsSendSize

使用以下方式发送数据报时不使用:

mySocket.SendToAsync(mySocketAsyncEventArgs);

而是发送SocketAsyncEventArgs.Buffer中的整个段来自Offset for Count字节!我不能使用Socket.SendPacketsElements,因为那只适用于已连接的套接字!

通常我只会发送几个字节,但有时会发送一千个..如果这些重载的重点是提高效率 - 它们没有帮助!

请告诉我有办法在每个操作中指定SocketAsyncEventArgs.Buffer中要发送的字节数。

3 个答案:

答案 0 :(得分:0)

UDP协议将始终在一个数据包中发送所有数据。如果要发送不基于数据的包大小,则需要使用TCP。

答案 1 :(得分:0)

您是否尝试将SendPacketsSendSize设置为0xFFFFFFFF并使用SendPacketsElement.EndOfPacket?在文档中听起来很有希望:http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.sendpacketssendsize.aspx

答案 2 :(得分:0)

您可以使用SetBuffer()重载,而不必传递byte []缓冲区 - 只需调整现有索引和计数即可使用 - 然后在操作集计数后返回原始值:< / p>

mySocketAsyncEventArgs.SetBuffer(mySocketAsyncEventArgs.Offset, numOfBytesWritten);
mySocket.SendToAsync(mySocketAsyncEventArgs);
...
mySocketAsyncEventArgs.SetBuffer(mySocketAsyncEventArgs.Offset, originalBufferSize);