c # - Er der en måde at til UDP .net-stikket til at frigive en bundet port, når stikket er lukket?

Indlæg af Hanne Mølgaard Plasc

Problem



Til dette spørgsmål kører jeg Windows 7 64 bit, .net framework 3.5


Hvad jeg virkelig gerne vil vide er



  1. Er der en måde at ophæve/frigive en port, der har været bundet til?

  2. Når jeg angiver genbrugsadresse for socketoption, kan jeg binde til porten, men jeg modtager aldrig data ved hjælp af den pågældende adresse/port?



Jeg ser på hvilke porte der er bundet ved at bruge netstat -apd udp


Testkoden jeg bruger er under, normalt ville jeg ikke lukke porten efter at have modtaget en pakke.


EndPoint endpoint = new IPEndPoint(state.IPAddress, state.Port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);                    
socket.Bind(endpoint);


ReadStateObject stateObject = new ReadStateObject();
stateObject.socket = socket;
stateObject.Port = state.Port;
stateObject.IPAddress = state.IPAddress;
stateObject.BurstDataReceivedEvent = state.BurstDataReceivedEvent;
stateObject.shutdownRequested = state.StopRequestedEvent;
socket.BeginReceiveFrom(stateObject.buffer,
                        0,
                        stateObject.buffer.Length,
                        SocketFlags.None, // Was 0 which is likely the same enumeration but this is clearer
                        ref endpoint,
                        new AsyncCallback(BurstUdpListener.SocketBeginReceiveAsyncCallback),
                         stateObject);

// wait for read to complete... or the thread to be asked to stop
while (stateObject.readFinished.WaitOne(100, false) == false)
{
    // has this thread been requested to stop? if so, cancel the pending read
    if (state.StopRequestedEvent.WaitOne(1, false) == true)
    {
        stop = true;
        break;
     }
 }

 socket.Shutdown(SocketShutdown.Both);
 socket.Close();
 socket = null;



    private static void SocketBeginReceiveAsyncCallback(IAsyncResult ar)
    {

            if (ar.IsCompleted)
            {
                ReadStateObject state = ar.AsyncState as ReadStateObject;
                if (state != null)
                {
                    if (state.shutdownRequested.WaitOne(1, false))
                        return;
                    EndPoint endpoint = new IPEndPoint(state.IPAddress, state.Port);
                    int bytesReceived = state.socket.EndReceiveFrom(ar, ref endpoint); // for some reason throws error here on changes to settings
                    if (state.BurstDataReceivedEvent != null)
                    {
                        state.BurstDataReceivedEvent(null, new BurstDataReceivedEventArgs(state.buffer, bytesReceived));
                    }
                    state.readFinished.Set();
                }

         }            

 }

Bedste reference


Porten skal frigives, når close() bliver kaldt, så det lyder som enten close() bliver ikke kaldt eller det lykkes ikke.


Fjern shutdown() opkaldet, da det ikke rigtig gælder for UDP.


Kontroller fejlretningen af ​​close() for at sikre både, at den bliver kaldt, og at den vender tilbage.