How to make a call directly between two SIP clients (peer to peer calls without a PBX)

Download: Direct_Ip_Call.zip

This article is a detailed guide about making peer to peer SIP calls in relation with Ozeki VoIP SIP SDK. After reading through this page you will be fully familiar with all the essential terms concerning direct calls between two SIP clients and what you will need for creating your own solution using Ozeki VoIP SIP SDK.

What is Direct IP call? How does it work?

A VoIP phone call is usually made through a phone line that is established by a private branch exchange (PBX) using SIP messages. After establishing the phone call, the PBX quits the conversation and the communication is made by the two clients directly.

Figure 1 - VoIP peer to peer call

There are some cases when the PBX is not required in the connection phase and the VoIP clients can establish the connection directly. This connection is called peer to peer.

The following program code uses the background support of Ozeki VoIP SIP SDK, therefore you will need to download and install the SDK on your computer before starting to use the program code. You will also need to have Visual Studio 2010 or compatible IDE and .NET Framework installed on your system, as the program code below is written in C# language.

Direct IP call example in C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Ozeki.Media.MediaHandlers;
using Ozeki.VoIP;
using Ozeki.VoIP.SDK;

namespace DirectIpCall
    class Program
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static string caller;
        static Microphone microphone;
        static Speaker speaker;
        static PhoneCallAudioSender mediaSender;
        static PhoneCallAudioReceiver mediaReceiver;
        static MediaConnector connector;

        static void Main(string[] args)
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);

            microphone = Microphone.GetDefaultDevice();
            speaker = Speaker.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();

            Console.WriteLine("Please enter the IP address of your machine: ");
            var ipAddress = Console.ReadLine();
            var config = new DirectIPPhoneLineConfig(ipAddress, 5060);
            phoneLine = softphone.CreateDirectIPPhoneLine(config);
            phoneLine.RegistrationStateChanged += line_RegStateChanged;
            softphone.IncomingCall += softphone_IncomingCall;


        private static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
            if (e.State == RegState.NotRegistered || e.State == RegState.Error)
                Console.WriteLine("Registration failed!");

            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine("Registration succeeded - Online!");
                Console.WriteLine("Enter the IP address of the destination: ");

                string ipToDial = Console.ReadLine();

        private static void StartCall(string numberToDial)
            if (call == null)
                call = softphone.CreateDirectIPCallObject(phoneLine, new DirectIPDialParameters("5060"), numberToDial);
                call.CallStateChanged += call_CallStateChanged;


        static void softphone_IncomingCall(object sender, VoIPEventArgs e)
            call = e.Item;
            caller = call.DialInfo.CallerID;
            call.CallStateChanged += call_CallStateChanged;

        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
            Console.WriteLine("Call state: {0}.", e.State);

            if (e.State == CallState.Answered)

            if (e.State.IsCallEnded())

        static void SetupDevices()
            connector.Connect(microphone, mediaSender);

            connector.Connect(mediaReceiver, speaker);


        static void CloseDevices()


After setting the proper IP addresses in both softphones, you can use them to communicate peer to peer with any phone number they call.

This article introduced you the basic knowledge about peer to peer calls between SIP clients and showed how Ozeki VoIP SIP SDK can help you to fulfill your wishes about this topic. If you have read through this page carefully, you already have all the knowledge you need to start on your own solution.

As you are now familiar with all the terms concerning this topic, now it is time to take a step further and explore what other extraordinary solution Ozeki VoIP SIP SDK can provide to you.

Related Pages