fo-DICOM: How to specify the local outgoing port in DicomClient?

804 views Asked by At

There is way for TcpClient to assign local outgoing port as described here.

Is it possible to have the same functionality for fo-DICOM DicomClient?

This is necessary because the server is listening for a connection from a specific client port only.

2

There are 2 answers

0
Amit Joshi On

You have raised an issue on github. Following is the feedback from there:

This is currently not supported. You can work around this limitation by implementing your own NetworkManager, and taking heavy inspiration from the existing DesktopNetworkManager and DesktopNetworkStream. In DesktopNetworkStream, the TcpClient is created. That is the place where you would need to make your own custom changes.

Looking at the reply to my comment there, it appears that the issue is now fixed and the feature is now available.

0
Amit Joshi On

This answer is applicable to older (4.0.1.0 or nearby) versions of fo-DICOM. With latest version, the classes and methods mentioned in this answer are deprecated.


Using overload of DicomClient.Send method, the INetworkStream can be used to provide local outgoing port while working as SCU using fo-DICOM.

As an example, there are four methods available for CSTORE as SCU. First two are:

public void Send(string host, int port, bool useTls, string callingAe, string calledAe, int millisecondsTimeout = 5000);
public Task SendAsync(string host, int port, bool useTls, string callingAe, string calledAe, int millisecondsTimeout = 5000);

The host and port are remote host and remote port. None of it accept IPEndPoint as parameter.

Now, look at other two methods:

public void Send(INetworkStream stream, string callingAe, string calledAe, int millisecondsTimeout = 5000);
public Task SendAsync(INetworkStream stream, string callingAe, string calledAe, int millisecondsTimeout = 5000);

Those accept INetworkStream which looks like below:

public interface INetworkStream : IDisposable
{
    string LocalHost { get; }
    int LocalPort { get; }
    string RemoteHost { get; }
    int RemotePort { get; }
    Stream AsStream();
}

This allow providing LocalPort to you. You need to write implementation for that interface. Not sure if DesktopNetworkStream (implementation of INetworkStream) can be used directly.