2

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

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

mySocketAsyncEventArgs.SendPacketsSendSize

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

mySocket.SendToAsync(mySocketAsyncEventArgs);

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

通常我只会发送几个字节,但有时会发送一千个字节。如果这些重载的全部目的是提高效率 - 它们无济于事!

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

4

3 回答 3

0

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

于 2013-08-04T11:19:19.237 回答
0

您可以在不必传递 byte[] 缓冲区的情况下使用SetBuffer()重载 - 只需调整要使用的现有索引和计数 - 然后在操作后将计数设置回其原始值:

mySocketAsyncEventArgs.SetBuffer(mySocketAsyncEventArgs.Offset, numOfBytesWritten);
mySocket.SendToAsync(mySocketAsyncEventArgs);
...
mySocketAsyncEventArgs.SetBuffer(mySocketAsyncEventArgs.Offset, originalBufferSize);
于 2013-08-05T11:18:52.710 回答
0

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

于 2013-08-04T12:57:45.530 回答