IAsyncResult DoBeginSend(byte[] datagram, int bytes,
IPEndPoint endPoint,
AsyncCallback requestCallback,
object state)
{
/* Catch EACCES and turn on SO_BROADCAST then,
* as UDP sockets don't have it set by default
*/
try
{
if (endPoint == null)
{
return (socket.BeginSend(datagram, 0, bytes, SocketFlags.None, requestCallback, state));
}
else
{
return (socket.BeginSendTo(datagram, 0, bytes, SocketFlags.None, endPoint, requestCallback, state));
}
}
catch (SocketException ex)
{
if (ex.ErrorCode == (int)SocketError.AccessDenied)
{
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
if (endPoint == null)
{
return (socket.BeginSend(datagram, 0, bytes, SocketFlags.None, requestCallback, state));
}
else
{
return (socket.BeginSendTo(datagram, 0, bytes, SocketFlags.None, endPoint, requestCallback, state));
}
}
else
{
throw;
}
}
}