[FlagsAttribute()]
public enum DicomNetIpTypeFlags
[FlagsAttribute()]
public enum class DicomNetIpTypeFlags
Value | Member | Description |
---|---|---|
0x00000000 | None | None. |
0x00000001 | Ipv4 | Only support IPv4 addresses. |
0x00000002 | Ipv6 | Only support IPv6 addresses. |
0x00000003 | Ipv4OrIpv6 | Support both IPv4 and IPv6 addresses. |
This enumeration is used with Listen and Connect to specify the version of the Internet Protocol that will be used.
using Leadtools;
using Leadtools.Dicom;
///
[StructLayout(LayoutKind.Sequential)]
public struct MYMSG
{
public IntPtr hwnd;
public uint message;
public IntPtr wParam;
public IntPtr lParam;
public uint time;
public System.Drawing.Point p;
}
public enum MyWaitReturn
{
Complete,
Timeout,
}
class MyUtils
{
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool PeekMessage(out MYMSG lpMsg, IntPtr hWnd,
uint wMsgFilterMin, uint wMsgFilterMax,
uint wRemoveMsg);
[DllImport("user32.dll")]
static extern bool TranslateMessage([In] ref MYMSG lpMsg);
[DllImport("user32.dll")]
static extern IntPtr DispatchMessage([In] ref MYMSG lpmsg);
const uint PM_REMOVE = 1;
public static MyWaitReturn WaitForComplete(double mill, WaitHandle wh)
{
TimeSpan goal = new TimeSpan(DateTime.Now.AddMilliseconds(mill).Ticks);
do
{
MYMSG msg = new MYMSG();
if (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE))
{
TranslateMessage(ref msg);
DispatchMessage(ref msg);
}
if (wh.WaitOne(new TimeSpan(0, 0, 0), false))
{
return MyWaitReturn.Complete;
}
if (goal.CompareTo(new TimeSpan(DateTime.Now.Ticks)) < 0)
{
return MyWaitReturn.Timeout;
}
} while (true);
}
}
class MyClient : DicomNet
{
DicomExceptionCode _LastError = DicomExceptionCode.Success;
AutoResetEvent waitEvent = new AutoResetEvent(false);
public MyClient()
: base(null, DicomNetSecurityMode.None)
{
}
public DicomExceptionCode LastError
{
get
{
return _LastError;
}
}
public bool Wait()
{
_LastError = DicomExceptionCode.Success;
MyWaitReturn ret = MyUtils.WaitForComplete((5 * 60) * 1000, waitEvent);
return (ret == MyWaitReturn.Complete);
}
protected override void OnConnect(DicomExceptionCode error)
{
Debug.WriteLine("Client: Receive OnConnect");
_LastError = error;
waitEvent.Set();
}
protected override void OnReceiveReleaseResponse()
{
Debug.WriteLine("Client: Receive OnReceiveReleaseResponse");
waitEvent.Set();
}
}
class MyServerConnection : DicomNet
{
public bool Fail = false;
public MyServerConnection()
: base(null, DicomNetSecurityMode.None)
{
}
protected override void OnReceiveReleaseRequest()
{
Debug.WriteLine("Server: Receive OnReceiveReleaseRequest");
SendReleaseResponse();
}
};
class MyServer : DicomNet
{
MyServerConnection client;
public MyServer()
: base(null, DicomNetSecurityMode.None)
{
}
public bool Fail
{
get
{
if (client == null)
return false;
return client.Fail;
}
set
{
if (client != null)
{
client.Fail = value;
}
}
}
protected override void OnAccept(DicomExceptionCode error)
{
Debug.WriteLine("Server: Receive OnAccept");
client = new MyServerConnection();
Accept(client);
string s = string.Format("\tPeerAddress: {0}\n\tPeerPort: {1}", client.PeerAddress, client.PeerPort);
Debug.WriteLine(s);
}
}
public void DicomDataSet_ListenExample()
{
DicomEngine.Startup();
DicomNet.Startup();
using (MyServer server = new MyServer())
{
using (MyClient client = new MyClient())
{
// The * below means to listen on all local IP addresses.
// The DicomNetIpTypeFlags.Ipv4OrIpv6 means to listen on both IPv4 and IPv6 addresses
server.Listen("*", 104, 1, DicomNetIpTypeFlags.Ipv4OrIpv6); // start server
// The client is connecting to the server using an IPv6 address.
// Note that "::1" is the IPv6 loopback address
// Alternatively, you can get type ipconfig from a command box on the local computer to get the local IPv6 address.
// The following is an example of a local IPv6 address:
// "fe80::18bd:81f:6b02:759f"
client.Connect(null, 1000, "::1", 104, DicomNetIpTypeFlags.Ipv6); // connect to server
if (!client.Wait()) // wait for connection to finish
{
Assert.Fail("Connection timed out");
}
if (client.LastError == DicomExceptionCode.NetAddressInUse)
{
client.CloseForced(true);
server.CloseForced(true);
DicomEngine.Shutdown();
DicomNet.Shutdown();
}
Assert.IsTrue(client.LastError == DicomExceptionCode.Success, $"Connection failed: {client.LastError} ");
Assert.IsTrue(client.IsConnected() == true, $"Client {client} not connected");
client.SendReleaseRequest();
if (!client.Wait()) // wait for connection to finish
{
Assert.Fail("Timed Out");
}
// Close the connections
client.CloseForced(true);
}
server.CloseForced(true);
}
DicomEngine.Shutdown();
DicomNet.Shutdown();
}
Help Collections
Raster .NET | C API | C++ Class Library | HTML5 JavaScript
Document .NET | C API | C++ Class Library | HTML5 JavaScript
Medical .NET | C API | C++ Class Library | HTML5 JavaScript
Medical Web Viewer .NET
Multimedia
Direct Show .NET | C API | Filters
Media Foundation .NET | C API | Transforms
Supported Platforms
.NET, Java, Android, and iOS/macOS Assemblies
Imaging, Medical, and Document
C API/C++ Class Libraries
Imaging, Medical, and Document
HTML5 JavaScript Libraries
Imaging, Medical, and Document