←Select platform

Connect(string,int,string,int,DicomNetIpTypeFlags) Method

Summary
Connects an Called AE to an Calling AE.
Syntax
C#
C++/CLI
public void Connect( 
   string hostAddress, 
   int hostPort, 
   string peerAddress, 
   int peerPort, 
   DicomNetIpTypeFlags ipType 
) 
public: 
void Connect(  
   String^ hostAddress, 
   int hostPort, 
   String^ peerAddress, 
   int peerPort, 
   DicomNetIpTypeFlags ipType 
)  

Parameters

hostAddress
The IP address of the Called AE computer (the SCU's address).

hostPort
The port number of the Called AE computer (the SCU's port).

peerAddress
The IP address of the Calling AE computer to which to connect (the SCP's address).

peerPort
The port number of the Calling AE computer to which to connect (the SCP's port).

ipType
The type of ip address supported (IPv4, IPv6, or both)

Remarks

If hostAddress is an empty string or a null reference (Nothing in VB), the IP address will be the local computer's address. If hostPort is 0, the port number will be the number of the first available port. In most cases, pass 0 for this parameter. If you pass any port number other than 0, that port number will be used for the first connection and when you close the connection, LEADTOOLS will wait for the internal TCP timeout before releasing the port. This can lead to problems reconnecting. If you pass 0, then on subsequent connections LEADTOOLS will use the next available port.

To connect to an Calling AE as an Called AE, you must first create a DicomNet object. Then call Connect to establish the connection.

To use your computer as an Calling AE, you must first create a DicomNet object. Then call Listen to listen for incoming connection requests.

When an Called AE calls this method, it generates a call to OnAccept on the SCP.

This overload of the DicomNet.Connect method allows you to specify the type of Internet Protocol Version to use. Pass DicomNetIpTypeFlags.Ipv4 for [ipType](" id="iptypeparameterlink" class="popuplink.html) to support the Internet Protocol version 4 (IPv4), which is the standard "dotted quad" 32-bit address format that has been in use since 1981. An example of an IPv4 address is 192.168.0.195

Pass DicomNetIpTypeFlags.Ipv6 for [ipType](" id="iptypeparameterlink" class="popuplink.html) to support Internet Protocol Version 6 (IPv6). IPv6 uses a 128-bit address format. An example of an IPv6 address is fe80::18bd:81f:6b02:759f

To support both IPv4 and Ipv6 addresses, pass DicomNetIpTypeFlags.Ipv4OrIpv6 for [ipType](" id="iptypeparameterlink" class="popuplink.html).

If the call to Connect fails, make sure that the IP address that was passed for hostAddress is a valid address that is accessible within your network. You can verify the accessibility of both IPv4 and IPv6 addresses using the Windows ping command. For example, to verify that 192.168.0.195 is accessible within your network, perform the following steps:

  • Start command prompt, and type the following command
  • ping 192.168.0.195

Note that the following are equivalent:

  • Connect( hostAddress, hostPort, peerAddress, peerPort);
  • Connect( hostAddress, hostPort, peerAddress, peerPort, DicomNetIpTypeFlags.Ipv4);
Example
C#
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(); 
} 
Requirements

Target Platforms

Help Version 23.0.2024.2.29
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2024 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Dicom Assembly

Products | Support | Contact Us | Intellectual Property Notices
© 1991-2023 LEAD Technologies, Inc. All Rights Reserved.