روش کار با RTP در تماس SIp ي!!!

این مقاله درباره ی RTP یا (Real-time Transport Protocol) میباشد به دلیل عدم وجود چینن اموزشی بنده تصمیم به توضیح آن گرفتم

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

این مقاله خرد است خواشمندم باگسترش آن به دیگران یاری رسانید

دوستان این مقاله رو من چندقسمت نمیکنم و درهرلحظه اون روکاملتر میکنم تادوماه هرروزقسمتی این مقاله به روزرسانی میشه ویاچیزی بهش افزوده میشود.

این مقاله درباره ی RTP یا (Real-time Transport Protocol)  میباشد به دلیل عدم وجود چینن اموزشی بنده تصمیم به توضیح آن گرفتم
این مقاله خرد است خواشمندم باگسترش آن به دیگران یاری رسانید
دوستان این مقاله رو من چندقسمت نمیکنم و درهرلحظه اون روکاملتر میکنم تادوماه هرروزقسمتی این مقاله به روزرسانی میشه ویاچیزی بهش افزوده میشود.

||http://tosinso.com/files/get/86ea45eb-af8b-470f-9ee5-32bd915db9c7||
Figure 1 - روش کار RTP در نرم افزارهای تلفنی

RTPچیست وچگونه کارمیکند؟
یک فرمت استاندارشده بسته های ارسال صدا وتصویر در ip است این پروتکل RTP  همینین درکنار  RTP Control Protocol (RTCP) نیز به کارمیرود RTP برای باربری رشته های صدا وتصویر و...به کارمیرود درحالی که RTCP برای پایش(مانیتورینگ) امار انتقال و کیفیت سرویس . دروواقع RTCPخواهر RTPاست RTP سرویس تحویل نقطه به نقطه برای یک ترافیک بلادرنگ بوسیله این پروتکل­ها برای صدا و تصویر ارائه می­شود و همچنین این پروتکل­ها بر روی پروتکل UDP و در پاره­ای از اوقات بر روی پروتکل TCP کار می کنند و هیچ ضمانتی برای تحویل بسته ارائه نمی دهند . پروتکل SRTP  نیز ارائه رمزنگاری، احراز هویت پیام، یکپارچگی و حفاظت از داده RTP در کاربرد های unicast و multicast است.
پروتکل SIP یک پروتکل ارتباطی برای سیگنال دهی و کنترل جلسات ارتباطات چند رسانه ای است اگر به شکل بسته های RTP  و SIP نگاه کنید میفهمید که SIp  برای کنترل جلسه است اما صدا وتصویر با RTP ارسال میشه...

شاید این تعاریف گیج کننده باشند اما کوشش ما گسترش تعریف  RTP است و در زمانی دیگر به برسی دیگرپروتکل هامی پردازیم برای هر رشته ههای چندرسانه ای(صداوتصویر..)مانیاز به یک نشست RTP داریم هرنشست نیاز به یک ip و دوپورت دارد یکی برای RTP ویکی برای RTCP  که شماره RTP بااید زوج و شماره پورت RTCP باید فردباشد وعدد بعدی شماره پورت RTP نیز باشدیعنی دوپورت پشت سرهم بایدباشند شماره پورتهایی که میتوان به کاربرد میانه شماره پورتهای 1024-65535بایدباشد
سرایند RTP میتواند تا ۱۲ بایت ودرصورت نیاز میشود بابکارگیری قسمت اختیاری دادهای بیشتری را در سرآیند آن جایگذاری کرد
||http://tosinso.com/files/get/84993d71-4cfd-41fa-978f-94ea06740305||


ورژن:دوبیت است و ورژن آن رامشخص میکند
p (pading) :یک بیت وبرای  نشان دادن اینکه ایا دادهای اختیاری به بسته می افزاییم یانه به کارمیرود واین دادهای اختیاری نیز برای کارهای دیگر دیگر دراستفاده از الکورتیم های رمزگزاری نیز به کارمیرود.
X (extension): که نشان میدهد باشندگی(حضور) دادههای بیشتر میان سرآیند و دادهای ارسالی
CC (CSRC Count): جهار بیت که تعداد CSRC هارو.


M (Marker): یک بیت است ونشان میدهدداده ارتباط خاصی با برنامه کاربردی داره.
PT (Payload Type): هفت بیت وفرمت بار راتعیین میکندوتفسیرش با برنامه کاربردی ست
Sequence Number:شماره ترتیب شانزده بیت برای مشخص کردن شماره ترتیب بسته های ارسالی که گیرنده براساس ان شماره ترتیب بسته های دریافتی را کنارهم قرارمیدهد
Timestamp: :مهر زمانی است با 32بیت که به کارمیرود برای تواناساختن دریافت کنده برای بازپخش الگوها در فاصله زمانی مناسب وقتی که چندین رشته تصویریا صدا باشنده(حاضر) هستند مهر زمانی درهرکدام به صورت مستقل در هر رشته و ممکن است به همگام سازی مدیا وابسته نباشند
SSRC:سی  ودوبیت برای  شناسه منبع همگام ساز که به طور منحصربه فرد شناسیی میکنه منبع رشته رو.منبع هممگام ساز در درون همان نشست RTP نیز یکتاست
CSRC: آی دی های منبع کمک کننده که یکی یکی نام میبردند منبع های کمک کننده را برای رشته هایی که به وسیله منبع های چندگانه تولید شده اند
Extension header: (optional) The first 32-bit word contains a profile-specific identifier (16 bits) and a length specifier (16 bits) that indicates the length of the extension (EHL=extension header length) in 32-bit units, excluding the 32 bits of the extension header 

جه بهتر که کمی هم درباره جایگاه بسته های RTP درلایه سخن بگیم تانگاه شما به این موضوع بازتر بشه توضیحی نمیدم امایک عکس گویایی همه داستان ست.
||http://tosinso.com/files/get/8568d241-20d7-402b-b093-7c72a1cc5117||
این عکس هم تصویری نیکو در فکرشما به وجودمیاورد
||http://tosinso.com/files/get/6601d940-944d-4689-acfe-8d86777daba9||
خب من بنا رو بر شکل هاگذاشتم اماشکلهاای که روشن هستن وکسی روگیج نیمکند به مکانRTP و SIP در بالا دقت بکنید ببیند از udp و یا tcp برای کارشون به کارگیری میکنند و نیک نگاه کنید که Sip و Rtp ربطی به همدیگر ندارن وبسته های انها بدون دخالت هم ساخته میشوند
خب اینک فرمت بسته SIP که باید همه خانه های آن راهم تعریف کرد
||http://tosinso.com/files/get/9c640aa6-a634-466c-bf66-47ac83161439||

Version
The version field in SIP distinguishes SIP from IP and any other internet protocol that uses the same link layer frame as IP such as Stream Protocol.

Flow Label
The Flow Label is an expansion of the IP Service field. It is used to label packets as belonging to a particular traffic flow for which the server requires specific handling , for example real time service or non default quality of service

Payload Length
This specifies the length of the SIP packet. It does not include the header. This is a change from IP , where the receiver had to check that the payload length was not less than the header size , this is not necessary in SIP , and results in one less thing to be checked.

Payload Type
This uses the same values as the IP Protocol field. It specifies the type of the header immediately following the SIP header , such as TCP or UDP. It has been renamed to avoid confusion as to what is being referred to as the IP protocol - the protocol field or IP itself.

Hop Limit
The Hop Limit is set to some nonzero value , and decremented by one by each system that forwards the packet. The packet is discarded if the hop limit reaches zero. This is to prevent the packet getting stuck in a forwarding loop.Other uses include limiting the propagation of multicast packets, and it can also be used for diagnostic purposes. The time to live field in IP provided the same function, plus one extra one. This was to limit the amount of time that a packet spent in transit. This was discarded because it proved too costly to implement , and in some cases impossible to implement , for example in large subnets whose transit time is unpredictable. In practice many IP routers implemented time to live as hop limit , SIP legitimised this. Any higher level functions that cannot tolerate delivery delays , must provide their own method of recognising old packets.

Source Address
ادرسی 64بیتی است که ادرس فرستنده رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

Destination Address
ادرسی 64بیتی است که ادرس مقصد رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

مثالی از نام نویسی SIP با زبان سی شارپ
||http://tosinso.com/files/get/102e2f90-db97-4f8a-a515-4ffc1b308962||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Register
{
    class Program
    {
        private static ISoftPhone softphone;   // softphone object
        private static IPhoneLine phoneLine;   // phoneline object
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = sipusername;
            var displayName = sipdisplayname;
            var authenticationId = authenticationid;
            var registerPassword = Password;
            var domainHost = pbxip.voipprovider.com;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += sipAccount_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void sipAccount_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine(Registration succeeded - Online!);
        }
    }
}
<c#>
زنگ خوردن با SIP در سی شارپ

||http://tosinso.com/files/get/f31ab12f-8008-4b5e-8169-d4475c33b3e6||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Invite
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
        }
    }
}
<c#>

ارسال داده با سی شارپ
||http://tosinso.com/files/get/f7f5d2d9-1d3d-43f4-9120-3ed12f58b01e||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Microphone
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Microphone microphone;
        static MediaConnector connector;
        static PhoneCallAudioSender mediaSender;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            microphone = Microphone.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine(Registration succeeded - Online!);
                CreateCall();
            }
        }
 
        static void CreateCall()
        {
            var numberToDial = 853;
 
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void SetupMicrophone()
        {
            connector.Connect(microphone, mediaSender);
            mediaSender.AttachToCall(call);
 
            microphone.Start();
 
            Console.WriteLine(The microphone is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupMicrophone();
        }
    }
}
<c#>

دریافت داده با سی شارپ
||http://tosinso.com/files/get/b985cb66-4364-4392-bc8d-1a6820bbefc9||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);
 
            speaker.Start();
            Console.WriteLine(The speaker is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}
<c#>

رد تماس با سی شارپ
||http://tosinso.com/files/get/9a3dbbff-ee75-4544-b38e-cbc9a58d07f3||
<c#>
using System;
using Ozeki.VoIP;
 
namespace Reject_Incoming_Call
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.IncomingCall += softphone_IncomingCall;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
        }
 
        static void softphone_IncomingCall(object sender, VoIPEventArgs<IPhoneCall> e)
        {
            call = e.Item;
            call.Reject();
        }
    }
}
<c#>

Figure 1 - روش کار RTP در نرم افزارهای تلفنی

RTPچیست وچگونه کارمیکند؟

یک فرمت استاندارشده بسته های ارسال صدا وتصویر در ip است این پروتکل RTP همینین درکنار RTP Control Protocol (RTCP) نیز به کارمیرود RTP برای باربری رشته های صدا وتصویر و...به کارمیرود درحالی که RTCP برای پایش(مانیتورینگ) امار انتقال و کیفیت سرویس . دروواقع RTCPخواهر RTPاست RTP سرویس تحویل نقطه به نقطه برای یک ترافیک بلادرنگ بوسیله این پروتکل­ها برای صدا و تصویر ارائه می­شود و همچنین این پروتکل­ها بر روی پروتکل UDP و در پاره­ای از اوقات بر روی پروتکل TCP کار می کنند و هیچ ضمانتی برای تحویل بسته ارائه نمی دهند . پروتکل SRTP نیز ارائه رمزنگاری، احراز هویت پیام، یکپارچگی و حفاظت از داده RTP در کاربرد های unicast و multicast است.

پروتکل SIP یک پروتکل ارتباطی برای سیگنال دهی و کنترل جلسات ارتباطات چند رسانه ای است اگر به شکل بسته های RTP و SIP نگاه کنید میفهمید که SIp برای کنترل جلسه است اما صدا وتصویر با RTP ارسال میشه...

شاید این تعاریف گیج کننده باشند اما کوشش ما گسترش تعریف RTP است و در زمانی دیگر به برسی دیگرپروتکل هامی پردازیم برای هر رشته ههای چندرسانه ای(صداوتصویر..)مانیاز به یک نشست RTP داریم هرنشست نیاز به یک ip و دوپورت دارد یکی برای RTP ویکی برای RTCP که شماره RTP بااید زوج و شماره پورت RTCP باید فردباشد وعدد بعدی شماره پورت RTP نیز باشدیعنی دوپورت پشت سرهم بایدباشند شماره پورتهایی که میتوان به کاربرد میانه شماره پورتهای 1024-65535بایدباشد

سرایند RTP میتواند تا ۱۲ بایت ودرصورت نیاز میشود بابکارگیری قسمت اختیاری دادهای بیشتری را در سرآیند آن جایگذاری کرد

این مقاله درباره ی RTP یا (Real-time Transport Protocol)  میباشد به دلیل عدم وجود چینن اموزشی بنده تصمیم به توضیح آن گرفتم
این مقاله خرد است خواشمندم باگسترش آن به دیگران یاری رسانید
دوستان این مقاله رو من چندقسمت نمیکنم و درهرلحظه اون روکاملتر میکنم تادوماه هرروزقسمتی این مقاله به روزرسانی میشه ویاچیزی بهش افزوده میشود.

||http://tosinso.com/files/get/86ea45eb-af8b-470f-9ee5-32bd915db9c7||
Figure 1 - روش کار RTP در نرم افزارهای تلفنی

RTPچیست وچگونه کارمیکند؟
یک فرمت استاندارشده بسته های ارسال صدا وتصویر در ip است این پروتکل RTP  همینین درکنار  RTP Control Protocol (RTCP) نیز به کارمیرود RTP برای باربری رشته های صدا وتصویر و...به کارمیرود درحالی که RTCP برای پایش(مانیتورینگ) امار انتقال و کیفیت سرویس . دروواقع RTCPخواهر RTPاست RTP سرویس تحویل نقطه به نقطه برای یک ترافیک بلادرنگ بوسیله این پروتکل­ها برای صدا و تصویر ارائه می­شود و همچنین این پروتکل­ها بر روی پروتکل UDP و در پاره­ای از اوقات بر روی پروتکل TCP کار می کنند و هیچ ضمانتی برای تحویل بسته ارائه نمی دهند . پروتکل SRTP  نیز ارائه رمزنگاری، احراز هویت پیام، یکپارچگی و حفاظت از داده RTP در کاربرد های unicast و multicast است.
پروتکل SIP یک پروتکل ارتباطی برای سیگنال دهی و کنترل جلسات ارتباطات چند رسانه ای است اگر به شکل بسته های RTP  و SIP نگاه کنید میفهمید که SIp  برای کنترل جلسه است اما صدا وتصویر با RTP ارسال میشه...

شاید این تعاریف گیج کننده باشند اما کوشش ما گسترش تعریف  RTP است و در زمانی دیگر به برسی دیگرپروتکل هامی پردازیم برای هر رشته ههای چندرسانه ای(صداوتصویر..)مانیاز به یک نشست RTP داریم هرنشست نیاز به یک ip و دوپورت دارد یکی برای RTP ویکی برای RTCP  که شماره RTP بااید زوج و شماره پورت RTCP باید فردباشد وعدد بعدی شماره پورت RTP نیز باشدیعنی دوپورت پشت سرهم بایدباشند شماره پورتهایی که میتوان به کاربرد میانه شماره پورتهای 1024-65535بایدباشد
سرایند RTP میتواند تا ۱۲ بایت ودرصورت نیاز میشود بابکارگیری قسمت اختیاری دادهای بیشتری را در سرآیند آن جایگذاری کرد
||http://tosinso.com/files/get/84993d71-4cfd-41fa-978f-94ea06740305||


ورژن:دوبیت است و ورژن آن رامشخص میکند
p (pading) :یک بیت وبرای  نشان دادن اینکه ایا دادهای اختیاری به بسته می افزاییم یانه به کارمیرود واین دادهای اختیاری نیز برای کارهای دیگر دیگر دراستفاده از الکورتیم های رمزگزاری نیز به کارمیرود.
X (extension): که نشان میدهد باشندگی(حضور) دادههای بیشتر میان سرآیند و دادهای ارسالی
CC (CSRC Count): جهار بیت که تعداد CSRC هارو.


M (Marker): یک بیت است ونشان میدهدداده ارتباط خاصی با برنامه کاربردی داره.
PT (Payload Type): هفت بیت وفرمت بار راتعیین میکندوتفسیرش با برنامه کاربردی ست
Sequence Number:شماره ترتیب شانزده بیت برای مشخص کردن شماره ترتیب بسته های ارسالی که گیرنده براساس ان شماره ترتیب بسته های دریافتی را کنارهم قرارمیدهد
Timestamp: :مهر زمانی است با 32بیت که به کارمیرود برای تواناساختن دریافت کنده برای بازپخش الگوها در فاصله زمانی مناسب وقتی که چندین رشته تصویریا صدا باشنده(حاضر) هستند مهر زمانی درهرکدام به صورت مستقل در هر رشته و ممکن است به همگام سازی مدیا وابسته نباشند
SSRC:سی  ودوبیت برای  شناسه منبع همگام ساز که به طور منحصربه فرد شناسیی میکنه منبع رشته رو.منبع هممگام ساز در درون همان نشست RTP نیز یکتاست
CSRC: آی دی های منبع کمک کننده که یکی یکی نام میبردند منبع های کمک کننده را برای رشته هایی که به وسیله منبع های چندگانه تولید شده اند
Extension header: (optional) The first 32-bit word contains a profile-specific identifier (16 bits) and a length specifier (16 bits) that indicates the length of the extension (EHL=extension header length) in 32-bit units, excluding the 32 bits of the extension header 

جه بهتر که کمی هم درباره جایگاه بسته های RTP درلایه سخن بگیم تانگاه شما به این موضوع بازتر بشه توضیحی نمیدم امایک عکس گویایی همه داستان ست.
||http://tosinso.com/files/get/8568d241-20d7-402b-b093-7c72a1cc5117||
این عکس هم تصویری نیکو در فکرشما به وجودمیاورد
||http://tosinso.com/files/get/6601d940-944d-4689-acfe-8d86777daba9||
خب من بنا رو بر شکل هاگذاشتم اماشکلهاای که روشن هستن وکسی روگیج نیمکند به مکانRTP و SIP در بالا دقت بکنید ببیند از udp و یا tcp برای کارشون به کارگیری میکنند و نیک نگاه کنید که Sip و Rtp ربطی به همدیگر ندارن وبسته های انها بدون دخالت هم ساخته میشوند
خب اینک فرمت بسته SIP که باید همه خانه های آن راهم تعریف کرد
||http://tosinso.com/files/get/9c640aa6-a634-466c-bf66-47ac83161439||

Version
The version field in SIP distinguishes SIP from IP and any other internet protocol that uses the same link layer frame as IP such as Stream Protocol.

Flow Label
The Flow Label is an expansion of the IP Service field. It is used to label packets as belonging to a particular traffic flow for which the server requires specific handling , for example real time service or non default quality of service

Payload Length
This specifies the length of the SIP packet. It does not include the header. This is a change from IP , where the receiver had to check that the payload length was not less than the header size , this is not necessary in SIP , and results in one less thing to be checked.

Payload Type
This uses the same values as the IP Protocol field. It specifies the type of the header immediately following the SIP header , such as TCP or UDP. It has been renamed to avoid confusion as to what is being referred to as the IP protocol - the protocol field or IP itself.

Hop Limit
The Hop Limit is set to some nonzero value , and decremented by one by each system that forwards the packet. The packet is discarded if the hop limit reaches zero. This is to prevent the packet getting stuck in a forwarding loop.Other uses include limiting the propagation of multicast packets, and it can also be used for diagnostic purposes. The time to live field in IP provided the same function, plus one extra one. This was to limit the amount of time that a packet spent in transit. This was discarded because it proved too costly to implement , and in some cases impossible to implement , for example in large subnets whose transit time is unpredictable. In practice many IP routers implemented time to live as hop limit , SIP legitimised this. Any higher level functions that cannot tolerate delivery delays , must provide their own method of recognising old packets.

Source Address
ادرسی 64بیتی است که ادرس فرستنده رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

Destination Address
ادرسی 64بیتی است که ادرس مقصد رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

مثالی از نام نویسی SIP با زبان سی شارپ
||http://tosinso.com/files/get/102e2f90-db97-4f8a-a515-4ffc1b308962||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Register
{
    class Program
    {
        private static ISoftPhone softphone;   // softphone object
        private static IPhoneLine phoneLine;   // phoneline object
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = sipusername;
            var displayName = sipdisplayname;
            var authenticationId = authenticationid;
            var registerPassword = Password;
            var domainHost = pbxip.voipprovider.com;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += sipAccount_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void sipAccount_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine(Registration succeeded - Online!);
        }
    }
}
<c#>
زنگ خوردن با SIP در سی شارپ

||http://tosinso.com/files/get/f31ab12f-8008-4b5e-8169-d4475c33b3e6||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Invite
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
        }
    }
}
<c#>

ارسال داده با سی شارپ
||http://tosinso.com/files/get/f7f5d2d9-1d3d-43f4-9120-3ed12f58b01e||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Microphone
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Microphone microphone;
        static MediaConnector connector;
        static PhoneCallAudioSender mediaSender;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            microphone = Microphone.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine(Registration succeeded - Online!);
                CreateCall();
            }
        }
 
        static void CreateCall()
        {
            var numberToDial = 853;
 
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void SetupMicrophone()
        {
            connector.Connect(microphone, mediaSender);
            mediaSender.AttachToCall(call);
 
            microphone.Start();
 
            Console.WriteLine(The microphone is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupMicrophone();
        }
    }
}
<c#>

دریافت داده با سی شارپ
||http://tosinso.com/files/get/b985cb66-4364-4392-bc8d-1a6820bbefc9||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);
 
            speaker.Start();
            Console.WriteLine(The speaker is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}
<c#>

رد تماس با سی شارپ
||http://tosinso.com/files/get/9a3dbbff-ee75-4544-b38e-cbc9a58d07f3||
<c#>
using System;
using Ozeki.VoIP;
 
namespace Reject_Incoming_Call
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.IncomingCall += softphone_IncomingCall;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
        }
 
        static void softphone_IncomingCall(object sender, VoIPEventArgs<IPhoneCall> e)
        {
            call = e.Item;
            call.Reject();
        }
    }
}
<c#>

ورژن:دوبیت است و ورژن آن رامشخص میکند

p (pading) :یک بیت وبرای نشان دادن اینکه ایا دادهای اختیاری به بسته می افزاییم یانه به کارمیرود واین دادهای اختیاری نیز برای کارهای دیگر دیگر دراستفاده از الکورتیم های رمزگزاری نیز به کارمیرود.

X (extension): که نشان میدهد باشندگی(حضور) دادههای بیشتر میان سرآیند و دادهای ارسالی

CC (CSRC Count): جهار بیت که تعداد CSRC هارو.

M (Marker): یک بیت است ونشان میدهدداده ارتباط خاصی با برنامه کاربردی داره.

PT (Payload Type): هفت بیت وفرمت بار راتعیین میکندوتفسیرش با برنامه کاربردی ست

Sequence Number:شماره ترتیب شانزده بیت برای مشخص کردن شماره ترتیب بسته های ارسالی که گیرنده براساس ان شماره ترتیب بسته های دریافتی را کنارهم قرارمیدهد

Timestamp: :مهر زمانی است با 32بیت که به کارمیرود برای تواناساختن دریافت کنده برای بازپخش الگوها در فاصله زمانی مناسب وقتی که چندین رشته تصویریا صدا باشنده(حاضر) هستند مهر زمانی درهرکدام به صورت مستقل در هر رشته و ممکن است به همگام سازی مدیا وابسته نباشند

SSRC:سی ودوبیت برای شناسه منبع همگام ساز که به طور منحصربه فرد شناسیی میکنه منبع رشته رو.منبع هممگام ساز در درون همان نشست RTP نیز یکتاست

CSRC: آی دی های منبع کمک کننده که یکی یکی نام میبردند منبع های کمک کننده را برای رشته هایی که به وسیله منبع های چندگانه تولید شده اند

Extension header: (optional) The first 32-bit word contains a profile-specific identifier (16 bits) and a length specifier (16 bits) that indicates the length of the extension (EHL=extension header length) in 32-bit units, excluding the 32 bits of the extension header

جه بهتر که کمی هم درباره جایگاه بسته های RTP درلایه سخن بگیم تانگاه شما به این موضوع بازتر بشه توضیحی نمیدم امایک عکس گویایی همه داستان ست.

این مقاله درباره ی RTP یا (Real-time Transport Protocol)  میباشد به دلیل عدم وجود چینن اموزشی بنده تصمیم به توضیح آن گرفتم
این مقاله خرد است خواشمندم باگسترش آن به دیگران یاری رسانید
دوستان این مقاله رو من چندقسمت نمیکنم و درهرلحظه اون روکاملتر میکنم تادوماه هرروزقسمتی این مقاله به روزرسانی میشه ویاچیزی بهش افزوده میشود.

||http://tosinso.com/files/get/86ea45eb-af8b-470f-9ee5-32bd915db9c7||
Figure 1 - روش کار RTP در نرم افزارهای تلفنی

RTPچیست وچگونه کارمیکند؟
یک فرمت استاندارشده بسته های ارسال صدا وتصویر در ip است این پروتکل RTP  همینین درکنار  RTP Control Protocol (RTCP) نیز به کارمیرود RTP برای باربری رشته های صدا وتصویر و...به کارمیرود درحالی که RTCP برای پایش(مانیتورینگ) امار انتقال و کیفیت سرویس . دروواقع RTCPخواهر RTPاست RTP سرویس تحویل نقطه به نقطه برای یک ترافیک بلادرنگ بوسیله این پروتکل­ها برای صدا و تصویر ارائه می­شود و همچنین این پروتکل­ها بر روی پروتکل UDP و در پاره­ای از اوقات بر روی پروتکل TCP کار می کنند و هیچ ضمانتی برای تحویل بسته ارائه نمی دهند . پروتکل SRTP  نیز ارائه رمزنگاری، احراز هویت پیام، یکپارچگی و حفاظت از داده RTP در کاربرد های unicast و multicast است.
پروتکل SIP یک پروتکل ارتباطی برای سیگنال دهی و کنترل جلسات ارتباطات چند رسانه ای است اگر به شکل بسته های RTP  و SIP نگاه کنید میفهمید که SIp  برای کنترل جلسه است اما صدا وتصویر با RTP ارسال میشه...

شاید این تعاریف گیج کننده باشند اما کوشش ما گسترش تعریف  RTP است و در زمانی دیگر به برسی دیگرپروتکل هامی پردازیم برای هر رشته ههای چندرسانه ای(صداوتصویر..)مانیاز به یک نشست RTP داریم هرنشست نیاز به یک ip و دوپورت دارد یکی برای RTP ویکی برای RTCP  که شماره RTP بااید زوج و شماره پورت RTCP باید فردباشد وعدد بعدی شماره پورت RTP نیز باشدیعنی دوپورت پشت سرهم بایدباشند شماره پورتهایی که میتوان به کاربرد میانه شماره پورتهای 1024-65535بایدباشد
سرایند RTP میتواند تا ۱۲ بایت ودرصورت نیاز میشود بابکارگیری قسمت اختیاری دادهای بیشتری را در سرآیند آن جایگذاری کرد
||http://tosinso.com/files/get/84993d71-4cfd-41fa-978f-94ea06740305||


ورژن:دوبیت است و ورژن آن رامشخص میکند
p (pading) :یک بیت وبرای  نشان دادن اینکه ایا دادهای اختیاری به بسته می افزاییم یانه به کارمیرود واین دادهای اختیاری نیز برای کارهای دیگر دیگر دراستفاده از الکورتیم های رمزگزاری نیز به کارمیرود.
X (extension): که نشان میدهد باشندگی(حضور) دادههای بیشتر میان سرآیند و دادهای ارسالی
CC (CSRC Count): جهار بیت که تعداد CSRC هارو.


M (Marker): یک بیت است ونشان میدهدداده ارتباط خاصی با برنامه کاربردی داره.
PT (Payload Type): هفت بیت وفرمت بار راتعیین میکندوتفسیرش با برنامه کاربردی ست
Sequence Number:شماره ترتیب شانزده بیت برای مشخص کردن شماره ترتیب بسته های ارسالی که گیرنده براساس ان شماره ترتیب بسته های دریافتی را کنارهم قرارمیدهد
Timestamp: :مهر زمانی است با 32بیت که به کارمیرود برای تواناساختن دریافت کنده برای بازپخش الگوها در فاصله زمانی مناسب وقتی که چندین رشته تصویریا صدا باشنده(حاضر) هستند مهر زمانی درهرکدام به صورت مستقل در هر رشته و ممکن است به همگام سازی مدیا وابسته نباشند
SSRC:سی  ودوبیت برای  شناسه منبع همگام ساز که به طور منحصربه فرد شناسیی میکنه منبع رشته رو.منبع هممگام ساز در درون همان نشست RTP نیز یکتاست
CSRC: آی دی های منبع کمک کننده که یکی یکی نام میبردند منبع های کمک کننده را برای رشته هایی که به وسیله منبع های چندگانه تولید شده اند
Extension header: (optional) The first 32-bit word contains a profile-specific identifier (16 bits) and a length specifier (16 bits) that indicates the length of the extension (EHL=extension header length) in 32-bit units, excluding the 32 bits of the extension header 

جه بهتر که کمی هم درباره جایگاه بسته های RTP درلایه سخن بگیم تانگاه شما به این موضوع بازتر بشه توضیحی نمیدم امایک عکس گویایی همه داستان ست.
||http://tosinso.com/files/get/8568d241-20d7-402b-b093-7c72a1cc5117||
این عکس هم تصویری نیکو در فکرشما به وجودمیاورد
||http://tosinso.com/files/get/6601d940-944d-4689-acfe-8d86777daba9||
خب من بنا رو بر شکل هاگذاشتم اماشکلهاای که روشن هستن وکسی روگیج نیمکند به مکانRTP و SIP در بالا دقت بکنید ببیند از udp و یا tcp برای کارشون به کارگیری میکنند و نیک نگاه کنید که Sip و Rtp ربطی به همدیگر ندارن وبسته های انها بدون دخالت هم ساخته میشوند
خب اینک فرمت بسته SIP که باید همه خانه های آن راهم تعریف کرد
||http://tosinso.com/files/get/9c640aa6-a634-466c-bf66-47ac83161439||

Version
The version field in SIP distinguishes SIP from IP and any other internet protocol that uses the same link layer frame as IP such as Stream Protocol.

Flow Label
The Flow Label is an expansion of the IP Service field. It is used to label packets as belonging to a particular traffic flow for which the server requires specific handling , for example real time service or non default quality of service

Payload Length
This specifies the length of the SIP packet. It does not include the header. This is a change from IP , where the receiver had to check that the payload length was not less than the header size , this is not necessary in SIP , and results in one less thing to be checked.

Payload Type
This uses the same values as the IP Protocol field. It specifies the type of the header immediately following the SIP header , such as TCP or UDP. It has been renamed to avoid confusion as to what is being referred to as the IP protocol - the protocol field or IP itself.

Hop Limit
The Hop Limit is set to some nonzero value , and decremented by one by each system that forwards the packet. The packet is discarded if the hop limit reaches zero. This is to prevent the packet getting stuck in a forwarding loop.Other uses include limiting the propagation of multicast packets, and it can also be used for diagnostic purposes. The time to live field in IP provided the same function, plus one extra one. This was to limit the amount of time that a packet spent in transit. This was discarded because it proved too costly to implement , and in some cases impossible to implement , for example in large subnets whose transit time is unpredictable. In practice many IP routers implemented time to live as hop limit , SIP legitimised this. Any higher level functions that cannot tolerate delivery delays , must provide their own method of recognising old packets.

Source Address
ادرسی 64بیتی است که ادرس فرستنده رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

Destination Address
ادرسی 64بیتی است که ادرس مقصد رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

مثالی از نام نویسی SIP با زبان سی شارپ
||http://tosinso.com/files/get/102e2f90-db97-4f8a-a515-4ffc1b308962||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Register
{
    class Program
    {
        private static ISoftPhone softphone;   // softphone object
        private static IPhoneLine phoneLine;   // phoneline object
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = sipusername;
            var displayName = sipdisplayname;
            var authenticationId = authenticationid;
            var registerPassword = Password;
            var domainHost = pbxip.voipprovider.com;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += sipAccount_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void sipAccount_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine(Registration succeeded - Online!);
        }
    }
}
<c#>
زنگ خوردن با SIP در سی شارپ

||http://tosinso.com/files/get/f31ab12f-8008-4b5e-8169-d4475c33b3e6||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Invite
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
        }
    }
}
<c#>

ارسال داده با سی شارپ
||http://tosinso.com/files/get/f7f5d2d9-1d3d-43f4-9120-3ed12f58b01e||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Microphone
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Microphone microphone;
        static MediaConnector connector;
        static PhoneCallAudioSender mediaSender;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            microphone = Microphone.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine(Registration succeeded - Online!);
                CreateCall();
            }
        }
 
        static void CreateCall()
        {
            var numberToDial = 853;
 
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void SetupMicrophone()
        {
            connector.Connect(microphone, mediaSender);
            mediaSender.AttachToCall(call);
 
            microphone.Start();
 
            Console.WriteLine(The microphone is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupMicrophone();
        }
    }
}
<c#>

دریافت داده با سی شارپ
||http://tosinso.com/files/get/b985cb66-4364-4392-bc8d-1a6820bbefc9||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);
 
            speaker.Start();
            Console.WriteLine(The speaker is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}
<c#>

رد تماس با سی شارپ
||http://tosinso.com/files/get/9a3dbbff-ee75-4544-b38e-cbc9a58d07f3||
<c#>
using System;
using Ozeki.VoIP;
 
namespace Reject_Incoming_Call
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.IncomingCall += softphone_IncomingCall;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
        }
 
        static void softphone_IncomingCall(object sender, VoIPEventArgs<IPhoneCall> e)
        {
            call = e.Item;
            call.Reject();
        }
    }
}
<c#>

این عکس هم تصویری نیکو در فکرشما به وجودمیاورد

این مقاله درباره ی RTP یا (Real-time Transport Protocol)  میباشد به دلیل عدم وجود چینن اموزشی بنده تصمیم به توضیح آن گرفتم
این مقاله خرد است خواشمندم باگسترش آن به دیگران یاری رسانید
دوستان این مقاله رو من چندقسمت نمیکنم و درهرلحظه اون روکاملتر میکنم تادوماه هرروزقسمتی این مقاله به روزرسانی میشه ویاچیزی بهش افزوده میشود.

||http://tosinso.com/files/get/86ea45eb-af8b-470f-9ee5-32bd915db9c7||
Figure 1 - روش کار RTP در نرم افزارهای تلفنی

RTPچیست وچگونه کارمیکند؟
یک فرمت استاندارشده بسته های ارسال صدا وتصویر در ip است این پروتکل RTP  همینین درکنار  RTP Control Protocol (RTCP) نیز به کارمیرود RTP برای باربری رشته های صدا وتصویر و...به کارمیرود درحالی که RTCP برای پایش(مانیتورینگ) امار انتقال و کیفیت سرویس . دروواقع RTCPخواهر RTPاست RTP سرویس تحویل نقطه به نقطه برای یک ترافیک بلادرنگ بوسیله این پروتکل­ها برای صدا و تصویر ارائه می­شود و همچنین این پروتکل­ها بر روی پروتکل UDP و در پاره­ای از اوقات بر روی پروتکل TCP کار می کنند و هیچ ضمانتی برای تحویل بسته ارائه نمی دهند . پروتکل SRTP  نیز ارائه رمزنگاری، احراز هویت پیام، یکپارچگی و حفاظت از داده RTP در کاربرد های unicast و multicast است.
پروتکل SIP یک پروتکل ارتباطی برای سیگنال دهی و کنترل جلسات ارتباطات چند رسانه ای است اگر به شکل بسته های RTP  و SIP نگاه کنید میفهمید که SIp  برای کنترل جلسه است اما صدا وتصویر با RTP ارسال میشه...

شاید این تعاریف گیج کننده باشند اما کوشش ما گسترش تعریف  RTP است و در زمانی دیگر به برسی دیگرپروتکل هامی پردازیم برای هر رشته ههای چندرسانه ای(صداوتصویر..)مانیاز به یک نشست RTP داریم هرنشست نیاز به یک ip و دوپورت دارد یکی برای RTP ویکی برای RTCP  که شماره RTP بااید زوج و شماره پورت RTCP باید فردباشد وعدد بعدی شماره پورت RTP نیز باشدیعنی دوپورت پشت سرهم بایدباشند شماره پورتهایی که میتوان به کاربرد میانه شماره پورتهای 1024-65535بایدباشد
سرایند RTP میتواند تا ۱۲ بایت ودرصورت نیاز میشود بابکارگیری قسمت اختیاری دادهای بیشتری را در سرآیند آن جایگذاری کرد
||http://tosinso.com/files/get/84993d71-4cfd-41fa-978f-94ea06740305||


ورژن:دوبیت است و ورژن آن رامشخص میکند
p (pading) :یک بیت وبرای  نشان دادن اینکه ایا دادهای اختیاری به بسته می افزاییم یانه به کارمیرود واین دادهای اختیاری نیز برای کارهای دیگر دیگر دراستفاده از الکورتیم های رمزگزاری نیز به کارمیرود.
X (extension): که نشان میدهد باشندگی(حضور) دادههای بیشتر میان سرآیند و دادهای ارسالی
CC (CSRC Count): جهار بیت که تعداد CSRC هارو.


M (Marker): یک بیت است ونشان میدهدداده ارتباط خاصی با برنامه کاربردی داره.
PT (Payload Type): هفت بیت وفرمت بار راتعیین میکندوتفسیرش با برنامه کاربردی ست
Sequence Number:شماره ترتیب شانزده بیت برای مشخص کردن شماره ترتیب بسته های ارسالی که گیرنده براساس ان شماره ترتیب بسته های دریافتی را کنارهم قرارمیدهد
Timestamp: :مهر زمانی است با 32بیت که به کارمیرود برای تواناساختن دریافت کنده برای بازپخش الگوها در فاصله زمانی مناسب وقتی که چندین رشته تصویریا صدا باشنده(حاضر) هستند مهر زمانی درهرکدام به صورت مستقل در هر رشته و ممکن است به همگام سازی مدیا وابسته نباشند
SSRC:سی  ودوبیت برای  شناسه منبع همگام ساز که به طور منحصربه فرد شناسیی میکنه منبع رشته رو.منبع هممگام ساز در درون همان نشست RTP نیز یکتاست
CSRC: آی دی های منبع کمک کننده که یکی یکی نام میبردند منبع های کمک کننده را برای رشته هایی که به وسیله منبع های چندگانه تولید شده اند
Extension header: (optional) The first 32-bit word contains a profile-specific identifier (16 bits) and a length specifier (16 bits) that indicates the length of the extension (EHL=extension header length) in 32-bit units, excluding the 32 bits of the extension header 

جه بهتر که کمی هم درباره جایگاه بسته های RTP درلایه سخن بگیم تانگاه شما به این موضوع بازتر بشه توضیحی نمیدم امایک عکس گویایی همه داستان ست.
||http://tosinso.com/files/get/8568d241-20d7-402b-b093-7c72a1cc5117||
این عکس هم تصویری نیکو در فکرشما به وجودمیاورد
||http://tosinso.com/files/get/6601d940-944d-4689-acfe-8d86777daba9||
خب من بنا رو بر شکل هاگذاشتم اماشکلهاای که روشن هستن وکسی روگیج نیمکند به مکانRTP و SIP در بالا دقت بکنید ببیند از udp و یا tcp برای کارشون به کارگیری میکنند و نیک نگاه کنید که Sip و Rtp ربطی به همدیگر ندارن وبسته های انها بدون دخالت هم ساخته میشوند
خب اینک فرمت بسته SIP که باید همه خانه های آن راهم تعریف کرد
||http://tosinso.com/files/get/9c640aa6-a634-466c-bf66-47ac83161439||

Version
The version field in SIP distinguishes SIP from IP and any other internet protocol that uses the same link layer frame as IP such as Stream Protocol.

Flow Label
The Flow Label is an expansion of the IP Service field. It is used to label packets as belonging to a particular traffic flow for which the server requires specific handling , for example real time service or non default quality of service

Payload Length
This specifies the length of the SIP packet. It does not include the header. This is a change from IP , where the receiver had to check that the payload length was not less than the header size , this is not necessary in SIP , and results in one less thing to be checked.

Payload Type
This uses the same values as the IP Protocol field. It specifies the type of the header immediately following the SIP header , such as TCP or UDP. It has been renamed to avoid confusion as to what is being referred to as the IP protocol - the protocol field or IP itself.

Hop Limit
The Hop Limit is set to some nonzero value , and decremented by one by each system that forwards the packet. The packet is discarded if the hop limit reaches zero. This is to prevent the packet getting stuck in a forwarding loop.Other uses include limiting the propagation of multicast packets, and it can also be used for diagnostic purposes. The time to live field in IP provided the same function, plus one extra one. This was to limit the amount of time that a packet spent in transit. This was discarded because it proved too costly to implement , and in some cases impossible to implement , for example in large subnets whose transit time is unpredictable. In practice many IP routers implemented time to live as hop limit , SIP legitimised this. Any higher level functions that cannot tolerate delivery delays , must provide their own method of recognising old packets.

Source Address
ادرسی 64بیتی است که ادرس فرستنده رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

Destination Address
ادرسی 64بیتی است که ادرس مقصد رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

مثالی از نام نویسی SIP با زبان سی شارپ
||http://tosinso.com/files/get/102e2f90-db97-4f8a-a515-4ffc1b308962||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Register
{
    class Program
    {
        private static ISoftPhone softphone;   // softphone object
        private static IPhoneLine phoneLine;   // phoneline object
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = sipusername;
            var displayName = sipdisplayname;
            var authenticationId = authenticationid;
            var registerPassword = Password;
            var domainHost = pbxip.voipprovider.com;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += sipAccount_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void sipAccount_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine(Registration succeeded - Online!);
        }
    }
}
<c#>
زنگ خوردن با SIP در سی شارپ

||http://tosinso.com/files/get/f31ab12f-8008-4b5e-8169-d4475c33b3e6||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Invite
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
        }
    }
}
<c#>

ارسال داده با سی شارپ
||http://tosinso.com/files/get/f7f5d2d9-1d3d-43f4-9120-3ed12f58b01e||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Microphone
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Microphone microphone;
        static MediaConnector connector;
        static PhoneCallAudioSender mediaSender;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            microphone = Microphone.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine(Registration succeeded - Online!);
                CreateCall();
            }
        }
 
        static void CreateCall()
        {
            var numberToDial = 853;
 
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void SetupMicrophone()
        {
            connector.Connect(microphone, mediaSender);
            mediaSender.AttachToCall(call);
 
            microphone.Start();
 
            Console.WriteLine(The microphone is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupMicrophone();
        }
    }
}
<c#>

دریافت داده با سی شارپ
||http://tosinso.com/files/get/b985cb66-4364-4392-bc8d-1a6820bbefc9||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);
 
            speaker.Start();
            Console.WriteLine(The speaker is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}
<c#>

رد تماس با سی شارپ
||http://tosinso.com/files/get/9a3dbbff-ee75-4544-b38e-cbc9a58d07f3||
<c#>
using System;
using Ozeki.VoIP;
 
namespace Reject_Incoming_Call
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.IncomingCall += softphone_IncomingCall;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
        }
 
        static void softphone_IncomingCall(object sender, VoIPEventArgs<IPhoneCall> e)
        {
            call = e.Item;
            call.Reject();
        }
    }
}
<c#>

خب من بنا رو بر شکل هاگذاشتم اماشکلهاای که روشن هستن وکسی روگیج نیمکند به مکانRTP و SIP در بالا دقت بکنید ببیند از udp و یا tcp برای کارشون به کارگیری میکنند و نیک نگاه کنید که Sip و Rtp ربطی به همدیگر ندارن وبسته های انها بدون دخالت هم ساخته میشوند

خب اینک فرمت بسته SIP که باید همه خانه های آن راهم تعریف کرد

این مقاله درباره ی RTP یا (Real-time Transport Protocol)  میباشد به دلیل عدم وجود چینن اموزشی بنده تصمیم به توضیح آن گرفتم
این مقاله خرد است خواشمندم باگسترش آن به دیگران یاری رسانید
دوستان این مقاله رو من چندقسمت نمیکنم و درهرلحظه اون روکاملتر میکنم تادوماه هرروزقسمتی این مقاله به روزرسانی میشه ویاچیزی بهش افزوده میشود.

||http://tosinso.com/files/get/86ea45eb-af8b-470f-9ee5-32bd915db9c7||
Figure 1 - روش کار RTP در نرم افزارهای تلفنی

RTPچیست وچگونه کارمیکند؟
یک فرمت استاندارشده بسته های ارسال صدا وتصویر در ip است این پروتکل RTP  همینین درکنار  RTP Control Protocol (RTCP) نیز به کارمیرود RTP برای باربری رشته های صدا وتصویر و...به کارمیرود درحالی که RTCP برای پایش(مانیتورینگ) امار انتقال و کیفیت سرویس . دروواقع RTCPخواهر RTPاست RTP سرویس تحویل نقطه به نقطه برای یک ترافیک بلادرنگ بوسیله این پروتکل­ها برای صدا و تصویر ارائه می­شود و همچنین این پروتکل­ها بر روی پروتکل UDP و در پاره­ای از اوقات بر روی پروتکل TCP کار می کنند و هیچ ضمانتی برای تحویل بسته ارائه نمی دهند . پروتکل SRTP  نیز ارائه رمزنگاری، احراز هویت پیام، یکپارچگی و حفاظت از داده RTP در کاربرد های unicast و multicast است.
پروتکل SIP یک پروتکل ارتباطی برای سیگنال دهی و کنترل جلسات ارتباطات چند رسانه ای است اگر به شکل بسته های RTP  و SIP نگاه کنید میفهمید که SIp  برای کنترل جلسه است اما صدا وتصویر با RTP ارسال میشه...

شاید این تعاریف گیج کننده باشند اما کوشش ما گسترش تعریف  RTP است و در زمانی دیگر به برسی دیگرپروتکل هامی پردازیم برای هر رشته ههای چندرسانه ای(صداوتصویر..)مانیاز به یک نشست RTP داریم هرنشست نیاز به یک ip و دوپورت دارد یکی برای RTP ویکی برای RTCP  که شماره RTP بااید زوج و شماره پورت RTCP باید فردباشد وعدد بعدی شماره پورت RTP نیز باشدیعنی دوپورت پشت سرهم بایدباشند شماره پورتهایی که میتوان به کاربرد میانه شماره پورتهای 1024-65535بایدباشد
سرایند RTP میتواند تا ۱۲ بایت ودرصورت نیاز میشود بابکارگیری قسمت اختیاری دادهای بیشتری را در سرآیند آن جایگذاری کرد
||http://tosinso.com/files/get/84993d71-4cfd-41fa-978f-94ea06740305||


ورژن:دوبیت است و ورژن آن رامشخص میکند
p (pading) :یک بیت وبرای  نشان دادن اینکه ایا دادهای اختیاری به بسته می افزاییم یانه به کارمیرود واین دادهای اختیاری نیز برای کارهای دیگر دیگر دراستفاده از الکورتیم های رمزگزاری نیز به کارمیرود.
X (extension): که نشان میدهد باشندگی(حضور) دادههای بیشتر میان سرآیند و دادهای ارسالی
CC (CSRC Count): جهار بیت که تعداد CSRC هارو.


M (Marker): یک بیت است ونشان میدهدداده ارتباط خاصی با برنامه کاربردی داره.
PT (Payload Type): هفت بیت وفرمت بار راتعیین میکندوتفسیرش با برنامه کاربردی ست
Sequence Number:شماره ترتیب شانزده بیت برای مشخص کردن شماره ترتیب بسته های ارسالی که گیرنده براساس ان شماره ترتیب بسته های دریافتی را کنارهم قرارمیدهد
Timestamp: :مهر زمانی است با 32بیت که به کارمیرود برای تواناساختن دریافت کنده برای بازپخش الگوها در فاصله زمانی مناسب وقتی که چندین رشته تصویریا صدا باشنده(حاضر) هستند مهر زمانی درهرکدام به صورت مستقل در هر رشته و ممکن است به همگام سازی مدیا وابسته نباشند
SSRC:سی  ودوبیت برای  شناسه منبع همگام ساز که به طور منحصربه فرد شناسیی میکنه منبع رشته رو.منبع هممگام ساز در درون همان نشست RTP نیز یکتاست
CSRC: آی دی های منبع کمک کننده که یکی یکی نام میبردند منبع های کمک کننده را برای رشته هایی که به وسیله منبع های چندگانه تولید شده اند
Extension header: (optional) The first 32-bit word contains a profile-specific identifier (16 bits) and a length specifier (16 bits) that indicates the length of the extension (EHL=extension header length) in 32-bit units, excluding the 32 bits of the extension header 

جه بهتر که کمی هم درباره جایگاه بسته های RTP درلایه سخن بگیم تانگاه شما به این موضوع بازتر بشه توضیحی نمیدم امایک عکس گویایی همه داستان ست.
||http://tosinso.com/files/get/8568d241-20d7-402b-b093-7c72a1cc5117||
این عکس هم تصویری نیکو در فکرشما به وجودمیاورد
||http://tosinso.com/files/get/6601d940-944d-4689-acfe-8d86777daba9||
خب من بنا رو بر شکل هاگذاشتم اماشکلهاای که روشن هستن وکسی روگیج نیمکند به مکانRTP و SIP در بالا دقت بکنید ببیند از udp و یا tcp برای کارشون به کارگیری میکنند و نیک نگاه کنید که Sip و Rtp ربطی به همدیگر ندارن وبسته های انها بدون دخالت هم ساخته میشوند
خب اینک فرمت بسته SIP که باید همه خانه های آن راهم تعریف کرد
||http://tosinso.com/files/get/9c640aa6-a634-466c-bf66-47ac83161439||

Version
The version field in SIP distinguishes SIP from IP and any other internet protocol that uses the same link layer frame as IP such as Stream Protocol.

Flow Label
The Flow Label is an expansion of the IP Service field. It is used to label packets as belonging to a particular traffic flow for which the server requires specific handling , for example real time service or non default quality of service

Payload Length
This specifies the length of the SIP packet. It does not include the header. This is a change from IP , where the receiver had to check that the payload length was not less than the header size , this is not necessary in SIP , and results in one less thing to be checked.

Payload Type
This uses the same values as the IP Protocol field. It specifies the type of the header immediately following the SIP header , such as TCP or UDP. It has been renamed to avoid confusion as to what is being referred to as the IP protocol - the protocol field or IP itself.

Hop Limit
The Hop Limit is set to some nonzero value , and decremented by one by each system that forwards the packet. The packet is discarded if the hop limit reaches zero. This is to prevent the packet getting stuck in a forwarding loop.Other uses include limiting the propagation of multicast packets, and it can also be used for diagnostic purposes. The time to live field in IP provided the same function, plus one extra one. This was to limit the amount of time that a packet spent in transit. This was discarded because it proved too costly to implement , and in some cases impossible to implement , for example in large subnets whose transit time is unpredictable. In practice many IP routers implemented time to live as hop limit , SIP legitimised this. Any higher level functions that cannot tolerate delivery delays , must provide their own method of recognising old packets.

Source Address
ادرسی 64بیتی است که ادرس فرستنده رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

Destination Address
ادرسی 64بیتی است که ادرس مقصد رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

مثالی از نام نویسی SIP با زبان سی شارپ
||http://tosinso.com/files/get/102e2f90-db97-4f8a-a515-4ffc1b308962||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Register
{
    class Program
    {
        private static ISoftPhone softphone;   // softphone object
        private static IPhoneLine phoneLine;   // phoneline object
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = sipusername;
            var displayName = sipdisplayname;
            var authenticationId = authenticationid;
            var registerPassword = Password;
            var domainHost = pbxip.voipprovider.com;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += sipAccount_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void sipAccount_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine(Registration succeeded - Online!);
        }
    }
}
<c#>
زنگ خوردن با SIP در سی شارپ

||http://tosinso.com/files/get/f31ab12f-8008-4b5e-8169-d4475c33b3e6||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Invite
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
        }
    }
}
<c#>

ارسال داده با سی شارپ
||http://tosinso.com/files/get/f7f5d2d9-1d3d-43f4-9120-3ed12f58b01e||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Microphone
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Microphone microphone;
        static MediaConnector connector;
        static PhoneCallAudioSender mediaSender;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            microphone = Microphone.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine(Registration succeeded - Online!);
                CreateCall();
            }
        }
 
        static void CreateCall()
        {
            var numberToDial = 853;
 
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void SetupMicrophone()
        {
            connector.Connect(microphone, mediaSender);
            mediaSender.AttachToCall(call);
 
            microphone.Start();
 
            Console.WriteLine(The microphone is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupMicrophone();
        }
    }
}
<c#>

دریافت داده با سی شارپ
||http://tosinso.com/files/get/b985cb66-4364-4392-bc8d-1a6820bbefc9||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);
 
            speaker.Start();
            Console.WriteLine(The speaker is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}
<c#>

رد تماس با سی شارپ
||http://tosinso.com/files/get/9a3dbbff-ee75-4544-b38e-cbc9a58d07f3||
<c#>
using System;
using Ozeki.VoIP;
 
namespace Reject_Incoming_Call
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.IncomingCall += softphone_IncomingCall;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
        }
 
        static void softphone_IncomingCall(object sender, VoIPEventArgs<IPhoneCall> e)
        {
            call = e.Item;
            call.Reject();
        }
    }
}
<c#>

Version

The version field in SIP distinguishes SIP from IP and any other internet protocol that uses the same link layer frame as IP such as Stream Protocol.

Flow Label

The Flow Label is an expansion of the IP Service field. It is used to label packets as belonging to a particular traffic flow for which the server requires specific handling , for example real time service or non default quality of service

Payload Length

This specifies the length of the SIP packet. It does not include the header. This is a change from IP , where the receiver had to check that the payload length was not less than the header size , this is not necessary in SIP , and results in one less thing to be checked.

Payload Type

This uses the same values as the IP Protocol field. It specifies the type of the header immediately following the SIP header , such as TCP or UDP. It has been renamed to avoid confusion as to what is being referred to as the IP protocol - the protocol field or IP itself.

Hop Limit

The Hop Limit is set to some nonzero value , and decremented by one by each system that forwards the packet. The packet is discarded if the hop limit reaches zero. This is to prevent the packet getting stuck in a forwarding loop.Other uses include limiting the propagation of multicast packets, and it can also be used for diagnostic purposes. The "time to live" field in IP provided the same function, plus one extra one. This was to limit the amount of time that a packet spent in transit. This was discarded because it proved too costly to implement , and in some cases impossible to implement , for example in large subnets whose transit time is unpredictable. In practice many IP routers implemented time to live as hop limit , SIP legitimised this. Any higher level functions that cannot tolerate delivery delays , must provide their own method of recognising old packets.

Source Address

ادرسی 64بیتی است که ادرس فرستنده رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

Destination Address

ادرسی 64بیتی است که ادرس مقصد رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

مثالی از نام نویسی SIP با زبان سی شارپ

این مقاله درباره ی RTP یا (Real-time Transport Protocol)  میباشد به دلیل عدم وجود چینن اموزشی بنده تصمیم به توضیح آن گرفتم
این مقاله خرد است خواشمندم باگسترش آن به دیگران یاری رسانید
دوستان این مقاله رو من چندقسمت نمیکنم و درهرلحظه اون روکاملتر میکنم تادوماه هرروزقسمتی این مقاله به روزرسانی میشه ویاچیزی بهش افزوده میشود.

||http://tosinso.com/files/get/86ea45eb-af8b-470f-9ee5-32bd915db9c7||
Figure 1 - روش کار RTP در نرم افزارهای تلفنی

RTPچیست وچگونه کارمیکند؟
یک فرمت استاندارشده بسته های ارسال صدا وتصویر در ip است این پروتکل RTP  همینین درکنار  RTP Control Protocol (RTCP) نیز به کارمیرود RTP برای باربری رشته های صدا وتصویر و...به کارمیرود درحالی که RTCP برای پایش(مانیتورینگ) امار انتقال و کیفیت سرویس . دروواقع RTCPخواهر RTPاست RTP سرویس تحویل نقطه به نقطه برای یک ترافیک بلادرنگ بوسیله این پروتکل­ها برای صدا و تصویر ارائه می­شود و همچنین این پروتکل­ها بر روی پروتکل UDP و در پاره­ای از اوقات بر روی پروتکل TCP کار می کنند و هیچ ضمانتی برای تحویل بسته ارائه نمی دهند . پروتکل SRTP  نیز ارائه رمزنگاری، احراز هویت پیام، یکپارچگی و حفاظت از داده RTP در کاربرد های unicast و multicast است.
پروتکل SIP یک پروتکل ارتباطی برای سیگنال دهی و کنترل جلسات ارتباطات چند رسانه ای است اگر به شکل بسته های RTP  و SIP نگاه کنید میفهمید که SIp  برای کنترل جلسه است اما صدا وتصویر با RTP ارسال میشه...

شاید این تعاریف گیج کننده باشند اما کوشش ما گسترش تعریف  RTP است و در زمانی دیگر به برسی دیگرپروتکل هامی پردازیم برای هر رشته ههای چندرسانه ای(صداوتصویر..)مانیاز به یک نشست RTP داریم هرنشست نیاز به یک ip و دوپورت دارد یکی برای RTP ویکی برای RTCP  که شماره RTP بااید زوج و شماره پورت RTCP باید فردباشد وعدد بعدی شماره پورت RTP نیز باشدیعنی دوپورت پشت سرهم بایدباشند شماره پورتهایی که میتوان به کاربرد میانه شماره پورتهای 1024-65535بایدباشد
سرایند RTP میتواند تا ۱۲ بایت ودرصورت نیاز میشود بابکارگیری قسمت اختیاری دادهای بیشتری را در سرآیند آن جایگذاری کرد
||http://tosinso.com/files/get/84993d71-4cfd-41fa-978f-94ea06740305||


ورژن:دوبیت است و ورژن آن رامشخص میکند
p (pading) :یک بیت وبرای  نشان دادن اینکه ایا دادهای اختیاری به بسته می افزاییم یانه به کارمیرود واین دادهای اختیاری نیز برای کارهای دیگر دیگر دراستفاده از الکورتیم های رمزگزاری نیز به کارمیرود.
X (extension): که نشان میدهد باشندگی(حضور) دادههای بیشتر میان سرآیند و دادهای ارسالی
CC (CSRC Count): جهار بیت که تعداد CSRC هارو.


M (Marker): یک بیت است ونشان میدهدداده ارتباط خاصی با برنامه کاربردی داره.
PT (Payload Type): هفت بیت وفرمت بار راتعیین میکندوتفسیرش با برنامه کاربردی ست
Sequence Number:شماره ترتیب شانزده بیت برای مشخص کردن شماره ترتیب بسته های ارسالی که گیرنده براساس ان شماره ترتیب بسته های دریافتی را کنارهم قرارمیدهد
Timestamp: :مهر زمانی است با 32بیت که به کارمیرود برای تواناساختن دریافت کنده برای بازپخش الگوها در فاصله زمانی مناسب وقتی که چندین رشته تصویریا صدا باشنده(حاضر) هستند مهر زمانی درهرکدام به صورت مستقل در هر رشته و ممکن است به همگام سازی مدیا وابسته نباشند
SSRC:سی  ودوبیت برای  شناسه منبع همگام ساز که به طور منحصربه فرد شناسیی میکنه منبع رشته رو.منبع هممگام ساز در درون همان نشست RTP نیز یکتاست
CSRC: آی دی های منبع کمک کننده که یکی یکی نام میبردند منبع های کمک کننده را برای رشته هایی که به وسیله منبع های چندگانه تولید شده اند
Extension header: (optional) The first 32-bit word contains a profile-specific identifier (16 bits) and a length specifier (16 bits) that indicates the length of the extension (EHL=extension header length) in 32-bit units, excluding the 32 bits of the extension header 

جه بهتر که کمی هم درباره جایگاه بسته های RTP درلایه سخن بگیم تانگاه شما به این موضوع بازتر بشه توضیحی نمیدم امایک عکس گویایی همه داستان ست.
||http://tosinso.com/files/get/8568d241-20d7-402b-b093-7c72a1cc5117||
این عکس هم تصویری نیکو در فکرشما به وجودمیاورد
||http://tosinso.com/files/get/6601d940-944d-4689-acfe-8d86777daba9||
خب من بنا رو بر شکل هاگذاشتم اماشکلهاای که روشن هستن وکسی روگیج نیمکند به مکانRTP و SIP در بالا دقت بکنید ببیند از udp و یا tcp برای کارشون به کارگیری میکنند و نیک نگاه کنید که Sip و Rtp ربطی به همدیگر ندارن وبسته های انها بدون دخالت هم ساخته میشوند
خب اینک فرمت بسته SIP که باید همه خانه های آن راهم تعریف کرد
||http://tosinso.com/files/get/9c640aa6-a634-466c-bf66-47ac83161439||

Version
The version field in SIP distinguishes SIP from IP and any other internet protocol that uses the same link layer frame as IP such as Stream Protocol.

Flow Label
The Flow Label is an expansion of the IP Service field. It is used to label packets as belonging to a particular traffic flow for which the server requires specific handling , for example real time service or non default quality of service

Payload Length
This specifies the length of the SIP packet. It does not include the header. This is a change from IP , where the receiver had to check that the payload length was not less than the header size , this is not necessary in SIP , and results in one less thing to be checked.

Payload Type
This uses the same values as the IP Protocol field. It specifies the type of the header immediately following the SIP header , such as TCP or UDP. It has been renamed to avoid confusion as to what is being referred to as the IP protocol - the protocol field or IP itself.

Hop Limit
The Hop Limit is set to some nonzero value , and decremented by one by each system that forwards the packet. The packet is discarded if the hop limit reaches zero. This is to prevent the packet getting stuck in a forwarding loop.Other uses include limiting the propagation of multicast packets, and it can also be used for diagnostic purposes. The time to live field in IP provided the same function, plus one extra one. This was to limit the amount of time that a packet spent in transit. This was discarded because it proved too costly to implement , and in some cases impossible to implement , for example in large subnets whose transit time is unpredictable. In practice many IP routers implemented time to live as hop limit , SIP legitimised this. Any higher level functions that cannot tolerate delivery delays , must provide their own method of recognising old packets.

Source Address
ادرسی 64بیتی است که ادرس فرستنده رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

Destination Address
ادرسی 64بیتی است که ادرس مقصد رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

مثالی از نام نویسی SIP با زبان سی شارپ
||http://tosinso.com/files/get/102e2f90-db97-4f8a-a515-4ffc1b308962||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Register
{
    class Program
    {
        private static ISoftPhone softphone;   // softphone object
        private static IPhoneLine phoneLine;   // phoneline object
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = sipusername;
            var displayName = sipdisplayname;
            var authenticationId = authenticationid;
            var registerPassword = Password;
            var domainHost = pbxip.voipprovider.com;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += sipAccount_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void sipAccount_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine(Registration succeeded - Online!);
        }
    }
}
<c#>
زنگ خوردن با SIP در سی شارپ

||http://tosinso.com/files/get/f31ab12f-8008-4b5e-8169-d4475c33b3e6||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Invite
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
        }
    }
}
<c#>

ارسال داده با سی شارپ
||http://tosinso.com/files/get/f7f5d2d9-1d3d-43f4-9120-3ed12f58b01e||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Microphone
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Microphone microphone;
        static MediaConnector connector;
        static PhoneCallAudioSender mediaSender;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            microphone = Microphone.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine(Registration succeeded - Online!);
                CreateCall();
            }
        }
 
        static void CreateCall()
        {
            var numberToDial = 853;
 
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void SetupMicrophone()
        {
            connector.Connect(microphone, mediaSender);
            mediaSender.AttachToCall(call);
 
            microphone.Start();
 
            Console.WriteLine(The microphone is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupMicrophone();
        }
    }
}
<c#>

دریافت داده با سی شارپ
||http://tosinso.com/files/get/b985cb66-4364-4392-bc8d-1a6820bbefc9||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);
 
            speaker.Start();
            Console.WriteLine(The speaker is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}
<c#>

رد تماس با سی شارپ
||http://tosinso.com/files/get/9a3dbbff-ee75-4544-b38e-cbc9a58d07f3||
<c#>
using System;
using Ozeki.VoIP;
 
namespace Reject_Incoming_Call
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.IncomingCall += softphone_IncomingCall;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
        }
 
        static void softphone_IncomingCall(object sender, VoIPEventArgs<IPhoneCall> e)
        {
            call = e.Item;
            call.Reject();
        }
    }
}
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Register
{
    class Program
    {
        private static ISoftPhone softphone;   // softphone object
        private static IPhoneLine phoneLine;   // phoneline object
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = "sipusername";
            var displayName = "sipdisplayname";
            var authenticationId = "authenticationid";
            var registerPassword = "Password";
            var domainHost = "pbxip.voipprovider.com";
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += sipAccount_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error during SIP registration: " + ex);
            }
        }
 
        static void sipAccount_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine("Registration failed!");
 
            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine("Registration succeeded - Online!");
        }
    }
}

زنگ خوردن با SIP در سی شارپ

این مقاله درباره ی RTP یا (Real-time Transport Protocol)  میباشد به دلیل عدم وجود چینن اموزشی بنده تصمیم به توضیح آن گرفتم
این مقاله خرد است خواشمندم باگسترش آن به دیگران یاری رسانید
دوستان این مقاله رو من چندقسمت نمیکنم و درهرلحظه اون روکاملتر میکنم تادوماه هرروزقسمتی این مقاله به روزرسانی میشه ویاچیزی بهش افزوده میشود.

||http://tosinso.com/files/get/86ea45eb-af8b-470f-9ee5-32bd915db9c7||
Figure 1 - روش کار RTP در نرم افزارهای تلفنی

RTPچیست وچگونه کارمیکند؟
یک فرمت استاندارشده بسته های ارسال صدا وتصویر در ip است این پروتکل RTP  همینین درکنار  RTP Control Protocol (RTCP) نیز به کارمیرود RTP برای باربری رشته های صدا وتصویر و...به کارمیرود درحالی که RTCP برای پایش(مانیتورینگ) امار انتقال و کیفیت سرویس . دروواقع RTCPخواهر RTPاست RTP سرویس تحویل نقطه به نقطه برای یک ترافیک بلادرنگ بوسیله این پروتکل­ها برای صدا و تصویر ارائه می­شود و همچنین این پروتکل­ها بر روی پروتکل UDP و در پاره­ای از اوقات بر روی پروتکل TCP کار می کنند و هیچ ضمانتی برای تحویل بسته ارائه نمی دهند . پروتکل SRTP  نیز ارائه رمزنگاری، احراز هویت پیام، یکپارچگی و حفاظت از داده RTP در کاربرد های unicast و multicast است.
پروتکل SIP یک پروتکل ارتباطی برای سیگنال دهی و کنترل جلسات ارتباطات چند رسانه ای است اگر به شکل بسته های RTP  و SIP نگاه کنید میفهمید که SIp  برای کنترل جلسه است اما صدا وتصویر با RTP ارسال میشه...

شاید این تعاریف گیج کننده باشند اما کوشش ما گسترش تعریف  RTP است و در زمانی دیگر به برسی دیگرپروتکل هامی پردازیم برای هر رشته ههای چندرسانه ای(صداوتصویر..)مانیاز به یک نشست RTP داریم هرنشست نیاز به یک ip و دوپورت دارد یکی برای RTP ویکی برای RTCP  که شماره RTP بااید زوج و شماره پورت RTCP باید فردباشد وعدد بعدی شماره پورت RTP نیز باشدیعنی دوپورت پشت سرهم بایدباشند شماره پورتهایی که میتوان به کاربرد میانه شماره پورتهای 1024-65535بایدباشد
سرایند RTP میتواند تا ۱۲ بایت ودرصورت نیاز میشود بابکارگیری قسمت اختیاری دادهای بیشتری را در سرآیند آن جایگذاری کرد
||http://tosinso.com/files/get/84993d71-4cfd-41fa-978f-94ea06740305||


ورژن:دوبیت است و ورژن آن رامشخص میکند
p (pading) :یک بیت وبرای  نشان دادن اینکه ایا دادهای اختیاری به بسته می افزاییم یانه به کارمیرود واین دادهای اختیاری نیز برای کارهای دیگر دیگر دراستفاده از الکورتیم های رمزگزاری نیز به کارمیرود.
X (extension): که نشان میدهد باشندگی(حضور) دادههای بیشتر میان سرآیند و دادهای ارسالی
CC (CSRC Count): جهار بیت که تعداد CSRC هارو.


M (Marker): یک بیت است ونشان میدهدداده ارتباط خاصی با برنامه کاربردی داره.
PT (Payload Type): هفت بیت وفرمت بار راتعیین میکندوتفسیرش با برنامه کاربردی ست
Sequence Number:شماره ترتیب شانزده بیت برای مشخص کردن شماره ترتیب بسته های ارسالی که گیرنده براساس ان شماره ترتیب بسته های دریافتی را کنارهم قرارمیدهد
Timestamp: :مهر زمانی است با 32بیت که به کارمیرود برای تواناساختن دریافت کنده برای بازپخش الگوها در فاصله زمانی مناسب وقتی که چندین رشته تصویریا صدا باشنده(حاضر) هستند مهر زمانی درهرکدام به صورت مستقل در هر رشته و ممکن است به همگام سازی مدیا وابسته نباشند
SSRC:سی  ودوبیت برای  شناسه منبع همگام ساز که به طور منحصربه فرد شناسیی میکنه منبع رشته رو.منبع هممگام ساز در درون همان نشست RTP نیز یکتاست
CSRC: آی دی های منبع کمک کننده که یکی یکی نام میبردند منبع های کمک کننده را برای رشته هایی که به وسیله منبع های چندگانه تولید شده اند
Extension header: (optional) The first 32-bit word contains a profile-specific identifier (16 bits) and a length specifier (16 bits) that indicates the length of the extension (EHL=extension header length) in 32-bit units, excluding the 32 bits of the extension header 

جه بهتر که کمی هم درباره جایگاه بسته های RTP درلایه سخن بگیم تانگاه شما به این موضوع بازتر بشه توضیحی نمیدم امایک عکس گویایی همه داستان ست.
||http://tosinso.com/files/get/8568d241-20d7-402b-b093-7c72a1cc5117||
این عکس هم تصویری نیکو در فکرشما به وجودمیاورد
||http://tosinso.com/files/get/6601d940-944d-4689-acfe-8d86777daba9||
خب من بنا رو بر شکل هاگذاشتم اماشکلهاای که روشن هستن وکسی روگیج نیمکند به مکانRTP و SIP در بالا دقت بکنید ببیند از udp و یا tcp برای کارشون به کارگیری میکنند و نیک نگاه کنید که Sip و Rtp ربطی به همدیگر ندارن وبسته های انها بدون دخالت هم ساخته میشوند
خب اینک فرمت بسته SIP که باید همه خانه های آن راهم تعریف کرد
||http://tosinso.com/files/get/9c640aa6-a634-466c-bf66-47ac83161439||

Version
The version field in SIP distinguishes SIP from IP and any other internet protocol that uses the same link layer frame as IP such as Stream Protocol.

Flow Label
The Flow Label is an expansion of the IP Service field. It is used to label packets as belonging to a particular traffic flow for which the server requires specific handling , for example real time service or non default quality of service

Payload Length
This specifies the length of the SIP packet. It does not include the header. This is a change from IP , where the receiver had to check that the payload length was not less than the header size , this is not necessary in SIP , and results in one less thing to be checked.

Payload Type
This uses the same values as the IP Protocol field. It specifies the type of the header immediately following the SIP header , such as TCP or UDP. It has been renamed to avoid confusion as to what is being referred to as the IP protocol - the protocol field or IP itself.

Hop Limit
The Hop Limit is set to some nonzero value , and decremented by one by each system that forwards the packet. The packet is discarded if the hop limit reaches zero. This is to prevent the packet getting stuck in a forwarding loop.Other uses include limiting the propagation of multicast packets, and it can also be used for diagnostic purposes. The time to live field in IP provided the same function, plus one extra one. This was to limit the amount of time that a packet spent in transit. This was discarded because it proved too costly to implement , and in some cases impossible to implement , for example in large subnets whose transit time is unpredictable. In practice many IP routers implemented time to live as hop limit , SIP legitimised this. Any higher level functions that cannot tolerate delivery delays , must provide their own method of recognising old packets.

Source Address
ادرسی 64بیتی است که ادرس فرستنده رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

Destination Address
ادرسی 64بیتی است که ادرس مقصد رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

مثالی از نام نویسی SIP با زبان سی شارپ
||http://tosinso.com/files/get/102e2f90-db97-4f8a-a515-4ffc1b308962||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Register
{
    class Program
    {
        private static ISoftPhone softphone;   // softphone object
        private static IPhoneLine phoneLine;   // phoneline object
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = sipusername;
            var displayName = sipdisplayname;
            var authenticationId = authenticationid;
            var registerPassword = Password;
            var domainHost = pbxip.voipprovider.com;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += sipAccount_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void sipAccount_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine(Registration succeeded - Online!);
        }
    }
}
<c#>
زنگ خوردن با SIP در سی شارپ

||http://tosinso.com/files/get/f31ab12f-8008-4b5e-8169-d4475c33b3e6||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Invite
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
        }
    }
}
<c#>

ارسال داده با سی شارپ
||http://tosinso.com/files/get/f7f5d2d9-1d3d-43f4-9120-3ed12f58b01e||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Microphone
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Microphone microphone;
        static MediaConnector connector;
        static PhoneCallAudioSender mediaSender;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            microphone = Microphone.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine(Registration succeeded - Online!);
                CreateCall();
            }
        }
 
        static void CreateCall()
        {
            var numberToDial = 853;
 
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void SetupMicrophone()
        {
            connector.Connect(microphone, mediaSender);
            mediaSender.AttachToCall(call);
 
            microphone.Start();
 
            Console.WriteLine(The microphone is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupMicrophone();
        }
    }
}
<c#>

دریافت داده با سی شارپ
||http://tosinso.com/files/get/b985cb66-4364-4392-bc8d-1a6820bbefc9||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);
 
            speaker.Start();
            Console.WriteLine(The speaker is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}
<c#>

رد تماس با سی شارپ
||http://tosinso.com/files/get/9a3dbbff-ee75-4544-b38e-cbc9a58d07f3||
<c#>
using System;
using Ozeki.VoIP;
 
namespace Reject_Incoming_Call
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.IncomingCall += softphone_IncomingCall;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
        }
 
        static void softphone_IncomingCall(object sender, VoIPEventArgs<IPhoneCall> e)
        {
            call = e.Item;
            call.Reject();
        }
    }
}
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Invite
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = "858";
            var displayName = "858";
            var authenticationId = "858";
            var registerPassword = "858";
            var domainHost = "192.168.115.100";
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error during SIP registration: " + ex);
            }
        }
 
        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!");
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = "853";
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine("Call state: {0}.", e.State);
        }
    }
}

ارسال داده با سی شارپ

این مقاله درباره ی RTP یا (Real-time Transport Protocol)  میباشد به دلیل عدم وجود چینن اموزشی بنده تصمیم به توضیح آن گرفتم
این مقاله خرد است خواشمندم باگسترش آن به دیگران یاری رسانید
دوستان این مقاله رو من چندقسمت نمیکنم و درهرلحظه اون روکاملتر میکنم تادوماه هرروزقسمتی این مقاله به روزرسانی میشه ویاچیزی بهش افزوده میشود.

||http://tosinso.com/files/get/86ea45eb-af8b-470f-9ee5-32bd915db9c7||
Figure 1 - روش کار RTP در نرم افزارهای تلفنی

RTPچیست وچگونه کارمیکند؟
یک فرمت استاندارشده بسته های ارسال صدا وتصویر در ip است این پروتکل RTP  همینین درکنار  RTP Control Protocol (RTCP) نیز به کارمیرود RTP برای باربری رشته های صدا وتصویر و...به کارمیرود درحالی که RTCP برای پایش(مانیتورینگ) امار انتقال و کیفیت سرویس . دروواقع RTCPخواهر RTPاست RTP سرویس تحویل نقطه به نقطه برای یک ترافیک بلادرنگ بوسیله این پروتکل­ها برای صدا و تصویر ارائه می­شود و همچنین این پروتکل­ها بر روی پروتکل UDP و در پاره­ای از اوقات بر روی پروتکل TCP کار می کنند و هیچ ضمانتی برای تحویل بسته ارائه نمی دهند . پروتکل SRTP  نیز ارائه رمزنگاری، احراز هویت پیام، یکپارچگی و حفاظت از داده RTP در کاربرد های unicast و multicast است.
پروتکل SIP یک پروتکل ارتباطی برای سیگنال دهی و کنترل جلسات ارتباطات چند رسانه ای است اگر به شکل بسته های RTP  و SIP نگاه کنید میفهمید که SIp  برای کنترل جلسه است اما صدا وتصویر با RTP ارسال میشه...

شاید این تعاریف گیج کننده باشند اما کوشش ما گسترش تعریف  RTP است و در زمانی دیگر به برسی دیگرپروتکل هامی پردازیم برای هر رشته ههای چندرسانه ای(صداوتصویر..)مانیاز به یک نشست RTP داریم هرنشست نیاز به یک ip و دوپورت دارد یکی برای RTP ویکی برای RTCP  که شماره RTP بااید زوج و شماره پورت RTCP باید فردباشد وعدد بعدی شماره پورت RTP نیز باشدیعنی دوپورت پشت سرهم بایدباشند شماره پورتهایی که میتوان به کاربرد میانه شماره پورتهای 1024-65535بایدباشد
سرایند RTP میتواند تا ۱۲ بایت ودرصورت نیاز میشود بابکارگیری قسمت اختیاری دادهای بیشتری را در سرآیند آن جایگذاری کرد
||http://tosinso.com/files/get/84993d71-4cfd-41fa-978f-94ea06740305||


ورژن:دوبیت است و ورژن آن رامشخص میکند
p (pading) :یک بیت وبرای  نشان دادن اینکه ایا دادهای اختیاری به بسته می افزاییم یانه به کارمیرود واین دادهای اختیاری نیز برای کارهای دیگر دیگر دراستفاده از الکورتیم های رمزگزاری نیز به کارمیرود.
X (extension): که نشان میدهد باشندگی(حضور) دادههای بیشتر میان سرآیند و دادهای ارسالی
CC (CSRC Count): جهار بیت که تعداد CSRC هارو.


M (Marker): یک بیت است ونشان میدهدداده ارتباط خاصی با برنامه کاربردی داره.
PT (Payload Type): هفت بیت وفرمت بار راتعیین میکندوتفسیرش با برنامه کاربردی ست
Sequence Number:شماره ترتیب شانزده بیت برای مشخص کردن شماره ترتیب بسته های ارسالی که گیرنده براساس ان شماره ترتیب بسته های دریافتی را کنارهم قرارمیدهد
Timestamp: :مهر زمانی است با 32بیت که به کارمیرود برای تواناساختن دریافت کنده برای بازپخش الگوها در فاصله زمانی مناسب وقتی که چندین رشته تصویریا صدا باشنده(حاضر) هستند مهر زمانی درهرکدام به صورت مستقل در هر رشته و ممکن است به همگام سازی مدیا وابسته نباشند
SSRC:سی  ودوبیت برای  شناسه منبع همگام ساز که به طور منحصربه فرد شناسیی میکنه منبع رشته رو.منبع هممگام ساز در درون همان نشست RTP نیز یکتاست
CSRC: آی دی های منبع کمک کننده که یکی یکی نام میبردند منبع های کمک کننده را برای رشته هایی که به وسیله منبع های چندگانه تولید شده اند
Extension header: (optional) The first 32-bit word contains a profile-specific identifier (16 bits) and a length specifier (16 bits) that indicates the length of the extension (EHL=extension header length) in 32-bit units, excluding the 32 bits of the extension header 

جه بهتر که کمی هم درباره جایگاه بسته های RTP درلایه سخن بگیم تانگاه شما به این موضوع بازتر بشه توضیحی نمیدم امایک عکس گویایی همه داستان ست.
||http://tosinso.com/files/get/8568d241-20d7-402b-b093-7c72a1cc5117||
این عکس هم تصویری نیکو در فکرشما به وجودمیاورد
||http://tosinso.com/files/get/6601d940-944d-4689-acfe-8d86777daba9||
خب من بنا رو بر شکل هاگذاشتم اماشکلهاای که روشن هستن وکسی روگیج نیمکند به مکانRTP و SIP در بالا دقت بکنید ببیند از udp و یا tcp برای کارشون به کارگیری میکنند و نیک نگاه کنید که Sip و Rtp ربطی به همدیگر ندارن وبسته های انها بدون دخالت هم ساخته میشوند
خب اینک فرمت بسته SIP که باید همه خانه های آن راهم تعریف کرد
||http://tosinso.com/files/get/9c640aa6-a634-466c-bf66-47ac83161439||

Version
The version field in SIP distinguishes SIP from IP and any other internet protocol that uses the same link layer frame as IP such as Stream Protocol.

Flow Label
The Flow Label is an expansion of the IP Service field. It is used to label packets as belonging to a particular traffic flow for which the server requires specific handling , for example real time service or non default quality of service

Payload Length
This specifies the length of the SIP packet. It does not include the header. This is a change from IP , where the receiver had to check that the payload length was not less than the header size , this is not necessary in SIP , and results in one less thing to be checked.

Payload Type
This uses the same values as the IP Protocol field. It specifies the type of the header immediately following the SIP header , such as TCP or UDP. It has been renamed to avoid confusion as to what is being referred to as the IP protocol - the protocol field or IP itself.

Hop Limit
The Hop Limit is set to some nonzero value , and decremented by one by each system that forwards the packet. The packet is discarded if the hop limit reaches zero. This is to prevent the packet getting stuck in a forwarding loop.Other uses include limiting the propagation of multicast packets, and it can also be used for diagnostic purposes. The time to live field in IP provided the same function, plus one extra one. This was to limit the amount of time that a packet spent in transit. This was discarded because it proved too costly to implement , and in some cases impossible to implement , for example in large subnets whose transit time is unpredictable. In practice many IP routers implemented time to live as hop limit , SIP legitimised this. Any higher level functions that cannot tolerate delivery delays , must provide their own method of recognising old packets.

Source Address
ادرسی 64بیتی است که ادرس فرستنده رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

Destination Address
ادرسی 64بیتی است که ادرس مقصد رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

مثالی از نام نویسی SIP با زبان سی شارپ
||http://tosinso.com/files/get/102e2f90-db97-4f8a-a515-4ffc1b308962||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Register
{
    class Program
    {
        private static ISoftPhone softphone;   // softphone object
        private static IPhoneLine phoneLine;   // phoneline object
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = sipusername;
            var displayName = sipdisplayname;
            var authenticationId = authenticationid;
            var registerPassword = Password;
            var domainHost = pbxip.voipprovider.com;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += sipAccount_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void sipAccount_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine(Registration succeeded - Online!);
        }
    }
}
<c#>
زنگ خوردن با SIP در سی شارپ

||http://tosinso.com/files/get/f31ab12f-8008-4b5e-8169-d4475c33b3e6||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Invite
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
        }
    }
}
<c#>

ارسال داده با سی شارپ
||http://tosinso.com/files/get/f7f5d2d9-1d3d-43f4-9120-3ed12f58b01e||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Microphone
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Microphone microphone;
        static MediaConnector connector;
        static PhoneCallAudioSender mediaSender;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            microphone = Microphone.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine(Registration succeeded - Online!);
                CreateCall();
            }
        }
 
        static void CreateCall()
        {
            var numberToDial = 853;
 
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void SetupMicrophone()
        {
            connector.Connect(microphone, mediaSender);
            mediaSender.AttachToCall(call);
 
            microphone.Start();
 
            Console.WriteLine(The microphone is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupMicrophone();
        }
    }
}
<c#>

دریافت داده با سی شارپ
||http://tosinso.com/files/get/b985cb66-4364-4392-bc8d-1a6820bbefc9||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);
 
            speaker.Start();
            Console.WriteLine(The speaker is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}
<c#>

رد تماس با سی شارپ
||http://tosinso.com/files/get/9a3dbbff-ee75-4544-b38e-cbc9a58d07f3||
<c#>
using System;
using Ozeki.VoIP;
 
namespace Reject_Incoming_Call
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.IncomingCall += softphone_IncomingCall;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
        }
 
        static void softphone_IncomingCall(object sender, VoIPEventArgs<IPhoneCall> e)
        {
            call = e.Item;
            call.Reject();
        }
    }
}
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Microphone
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Microphone microphone;
        static MediaConnector connector;
        static PhoneCallAudioSender mediaSender;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = "858";
            var displayName = "858";
            var authenticationId = "858";
            var registerPassword = "858";
            var domainHost = "192.168.115.100";
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            microphone = Microphone.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error during SIP registration: " + ex);
            }
        }
 
        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine("Registration failed!");
 
            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine("Registration succeeded - Online!");
                CreateCall();
            }
        }
 
        static void CreateCall()
        {
            var numberToDial = "853";
 
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void SetupMicrophone()
        {
            connector.Connect(microphone, mediaSender);
            mediaSender.AttachToCall(call);
 
            microphone.Start();
 
            Console.WriteLine("The microphone is functioning.");
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine("Call state: {0}.", e.State);
 
            if (e.State == CallState.Answered)
                SetupMicrophone();
        }
    }
}

دریافت داده با سی شارپ

این مقاله درباره ی RTP یا (Real-time Transport Protocol)  میباشد به دلیل عدم وجود چینن اموزشی بنده تصمیم به توضیح آن گرفتم
این مقاله خرد است خواشمندم باگسترش آن به دیگران یاری رسانید
دوستان این مقاله رو من چندقسمت نمیکنم و درهرلحظه اون روکاملتر میکنم تادوماه هرروزقسمتی این مقاله به روزرسانی میشه ویاچیزی بهش افزوده میشود.

||http://tosinso.com/files/get/86ea45eb-af8b-470f-9ee5-32bd915db9c7||
Figure 1 - روش کار RTP در نرم افزارهای تلفنی

RTPچیست وچگونه کارمیکند؟
یک فرمت استاندارشده بسته های ارسال صدا وتصویر در ip است این پروتکل RTP  همینین درکنار  RTP Control Protocol (RTCP) نیز به کارمیرود RTP برای باربری رشته های صدا وتصویر و...به کارمیرود درحالی که RTCP برای پایش(مانیتورینگ) امار انتقال و کیفیت سرویس . دروواقع RTCPخواهر RTPاست RTP سرویس تحویل نقطه به نقطه برای یک ترافیک بلادرنگ بوسیله این پروتکل­ها برای صدا و تصویر ارائه می­شود و همچنین این پروتکل­ها بر روی پروتکل UDP و در پاره­ای از اوقات بر روی پروتکل TCP کار می کنند و هیچ ضمانتی برای تحویل بسته ارائه نمی دهند . پروتکل SRTP  نیز ارائه رمزنگاری، احراز هویت پیام، یکپارچگی و حفاظت از داده RTP در کاربرد های unicast و multicast است.
پروتکل SIP یک پروتکل ارتباطی برای سیگنال دهی و کنترل جلسات ارتباطات چند رسانه ای است اگر به شکل بسته های RTP  و SIP نگاه کنید میفهمید که SIp  برای کنترل جلسه است اما صدا وتصویر با RTP ارسال میشه...

شاید این تعاریف گیج کننده باشند اما کوشش ما گسترش تعریف  RTP است و در زمانی دیگر به برسی دیگرپروتکل هامی پردازیم برای هر رشته ههای چندرسانه ای(صداوتصویر..)مانیاز به یک نشست RTP داریم هرنشست نیاز به یک ip و دوپورت دارد یکی برای RTP ویکی برای RTCP  که شماره RTP بااید زوج و شماره پورت RTCP باید فردباشد وعدد بعدی شماره پورت RTP نیز باشدیعنی دوپورت پشت سرهم بایدباشند شماره پورتهایی که میتوان به کاربرد میانه شماره پورتهای 1024-65535بایدباشد
سرایند RTP میتواند تا ۱۲ بایت ودرصورت نیاز میشود بابکارگیری قسمت اختیاری دادهای بیشتری را در سرآیند آن جایگذاری کرد
||http://tosinso.com/files/get/84993d71-4cfd-41fa-978f-94ea06740305||


ورژن:دوبیت است و ورژن آن رامشخص میکند
p (pading) :یک بیت وبرای  نشان دادن اینکه ایا دادهای اختیاری به بسته می افزاییم یانه به کارمیرود واین دادهای اختیاری نیز برای کارهای دیگر دیگر دراستفاده از الکورتیم های رمزگزاری نیز به کارمیرود.
X (extension): که نشان میدهد باشندگی(حضور) دادههای بیشتر میان سرآیند و دادهای ارسالی
CC (CSRC Count): جهار بیت که تعداد CSRC هارو.


M (Marker): یک بیت است ونشان میدهدداده ارتباط خاصی با برنامه کاربردی داره.
PT (Payload Type): هفت بیت وفرمت بار راتعیین میکندوتفسیرش با برنامه کاربردی ست
Sequence Number:شماره ترتیب شانزده بیت برای مشخص کردن شماره ترتیب بسته های ارسالی که گیرنده براساس ان شماره ترتیب بسته های دریافتی را کنارهم قرارمیدهد
Timestamp: :مهر زمانی است با 32بیت که به کارمیرود برای تواناساختن دریافت کنده برای بازپخش الگوها در فاصله زمانی مناسب وقتی که چندین رشته تصویریا صدا باشنده(حاضر) هستند مهر زمانی درهرکدام به صورت مستقل در هر رشته و ممکن است به همگام سازی مدیا وابسته نباشند
SSRC:سی  ودوبیت برای  شناسه منبع همگام ساز که به طور منحصربه فرد شناسیی میکنه منبع رشته رو.منبع هممگام ساز در درون همان نشست RTP نیز یکتاست
CSRC: آی دی های منبع کمک کننده که یکی یکی نام میبردند منبع های کمک کننده را برای رشته هایی که به وسیله منبع های چندگانه تولید شده اند
Extension header: (optional) The first 32-bit word contains a profile-specific identifier (16 bits) and a length specifier (16 bits) that indicates the length of the extension (EHL=extension header length) in 32-bit units, excluding the 32 bits of the extension header 

جه بهتر که کمی هم درباره جایگاه بسته های RTP درلایه سخن بگیم تانگاه شما به این موضوع بازتر بشه توضیحی نمیدم امایک عکس گویایی همه داستان ست.
||http://tosinso.com/files/get/8568d241-20d7-402b-b093-7c72a1cc5117||
این عکس هم تصویری نیکو در فکرشما به وجودمیاورد
||http://tosinso.com/files/get/6601d940-944d-4689-acfe-8d86777daba9||
خب من بنا رو بر شکل هاگذاشتم اماشکلهاای که روشن هستن وکسی روگیج نیمکند به مکانRTP و SIP در بالا دقت بکنید ببیند از udp و یا tcp برای کارشون به کارگیری میکنند و نیک نگاه کنید که Sip و Rtp ربطی به همدیگر ندارن وبسته های انها بدون دخالت هم ساخته میشوند
خب اینک فرمت بسته SIP که باید همه خانه های آن راهم تعریف کرد
||http://tosinso.com/files/get/9c640aa6-a634-466c-bf66-47ac83161439||

Version
The version field in SIP distinguishes SIP from IP and any other internet protocol that uses the same link layer frame as IP such as Stream Protocol.

Flow Label
The Flow Label is an expansion of the IP Service field. It is used to label packets as belonging to a particular traffic flow for which the server requires specific handling , for example real time service or non default quality of service

Payload Length
This specifies the length of the SIP packet. It does not include the header. This is a change from IP , where the receiver had to check that the payload length was not less than the header size , this is not necessary in SIP , and results in one less thing to be checked.

Payload Type
This uses the same values as the IP Protocol field. It specifies the type of the header immediately following the SIP header , such as TCP or UDP. It has been renamed to avoid confusion as to what is being referred to as the IP protocol - the protocol field or IP itself.

Hop Limit
The Hop Limit is set to some nonzero value , and decremented by one by each system that forwards the packet. The packet is discarded if the hop limit reaches zero. This is to prevent the packet getting stuck in a forwarding loop.Other uses include limiting the propagation of multicast packets, and it can also be used for diagnostic purposes. The time to live field in IP provided the same function, plus one extra one. This was to limit the amount of time that a packet spent in transit. This was discarded because it proved too costly to implement , and in some cases impossible to implement , for example in large subnets whose transit time is unpredictable. In practice many IP routers implemented time to live as hop limit , SIP legitimised this. Any higher level functions that cannot tolerate delivery delays , must provide their own method of recognising old packets.

Source Address
ادرسی 64بیتی است که ادرس فرستنده رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

Destination Address
ادرسی 64بیتی است که ادرس مقصد رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

مثالی از نام نویسی SIP با زبان سی شارپ
||http://tosinso.com/files/get/102e2f90-db97-4f8a-a515-4ffc1b308962||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Register
{
    class Program
    {
        private static ISoftPhone softphone;   // softphone object
        private static IPhoneLine phoneLine;   // phoneline object
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = sipusername;
            var displayName = sipdisplayname;
            var authenticationId = authenticationid;
            var registerPassword = Password;
            var domainHost = pbxip.voipprovider.com;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += sipAccount_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void sipAccount_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine(Registration succeeded - Online!);
        }
    }
}
<c#>
زنگ خوردن با SIP در سی شارپ

||http://tosinso.com/files/get/f31ab12f-8008-4b5e-8169-d4475c33b3e6||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Invite
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
        }
    }
}
<c#>

ارسال داده با سی شارپ
||http://tosinso.com/files/get/f7f5d2d9-1d3d-43f4-9120-3ed12f58b01e||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Microphone
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Microphone microphone;
        static MediaConnector connector;
        static PhoneCallAudioSender mediaSender;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            microphone = Microphone.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine(Registration succeeded - Online!);
                CreateCall();
            }
        }
 
        static void CreateCall()
        {
            var numberToDial = 853;
 
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void SetupMicrophone()
        {
            connector.Connect(microphone, mediaSender);
            mediaSender.AttachToCall(call);
 
            microphone.Start();
 
            Console.WriteLine(The microphone is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupMicrophone();
        }
    }
}
<c#>

دریافت داده با سی شارپ
||http://tosinso.com/files/get/b985cb66-4364-4392-bc8d-1a6820bbefc9||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);
 
            speaker.Start();
            Console.WriteLine(The speaker is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}
<c#>

رد تماس با سی شارپ
||http://tosinso.com/files/get/9a3dbbff-ee75-4544-b38e-cbc9a58d07f3||
<c#>
using System;
using Ozeki.VoIP;
 
namespace Reject_Incoming_Call
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.IncomingCall += softphone_IncomingCall;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
        }
 
        static void softphone_IncomingCall(object sender, VoIPEventArgs<IPhoneCall> e)
        {
            call = e.Item;
            call.Reject();
        }
    }
}
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = "858";
            var displayName = "858";
            var authenticationId = "858";
            var registerPassword = "858";
            var domainHost = "192.168.115.100";
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error during SIP registration: " + ex);
            }
        }
 
        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!");
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = "853";
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);
 
            speaker.Start();
            Console.WriteLine("The speaker is functioning.");
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine("Call state: {0}.", e.State);
 
            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}

رد تماس با سی شارپ

این مقاله درباره ی RTP یا (Real-time Transport Protocol)  میباشد به دلیل عدم وجود چینن اموزشی بنده تصمیم به توضیح آن گرفتم
این مقاله خرد است خواشمندم باگسترش آن به دیگران یاری رسانید
دوستان این مقاله رو من چندقسمت نمیکنم و درهرلحظه اون روکاملتر میکنم تادوماه هرروزقسمتی این مقاله به روزرسانی میشه ویاچیزی بهش افزوده میشود.

||http://tosinso.com/files/get/86ea45eb-af8b-470f-9ee5-32bd915db9c7||
Figure 1 - روش کار RTP در نرم افزارهای تلفنی

RTPچیست وچگونه کارمیکند؟
یک فرمت استاندارشده بسته های ارسال صدا وتصویر در ip است این پروتکل RTP  همینین درکنار  RTP Control Protocol (RTCP) نیز به کارمیرود RTP برای باربری رشته های صدا وتصویر و...به کارمیرود درحالی که RTCP برای پایش(مانیتورینگ) امار انتقال و کیفیت سرویس . دروواقع RTCPخواهر RTPاست RTP سرویس تحویل نقطه به نقطه برای یک ترافیک بلادرنگ بوسیله این پروتکل­ها برای صدا و تصویر ارائه می­شود و همچنین این پروتکل­ها بر روی پروتکل UDP و در پاره­ای از اوقات بر روی پروتکل TCP کار می کنند و هیچ ضمانتی برای تحویل بسته ارائه نمی دهند . پروتکل SRTP  نیز ارائه رمزنگاری، احراز هویت پیام، یکپارچگی و حفاظت از داده RTP در کاربرد های unicast و multicast است.
پروتکل SIP یک پروتکل ارتباطی برای سیگنال دهی و کنترل جلسات ارتباطات چند رسانه ای است اگر به شکل بسته های RTP  و SIP نگاه کنید میفهمید که SIp  برای کنترل جلسه است اما صدا وتصویر با RTP ارسال میشه...

شاید این تعاریف گیج کننده باشند اما کوشش ما گسترش تعریف  RTP است و در زمانی دیگر به برسی دیگرپروتکل هامی پردازیم برای هر رشته ههای چندرسانه ای(صداوتصویر..)مانیاز به یک نشست RTP داریم هرنشست نیاز به یک ip و دوپورت دارد یکی برای RTP ویکی برای RTCP  که شماره RTP بااید زوج و شماره پورت RTCP باید فردباشد وعدد بعدی شماره پورت RTP نیز باشدیعنی دوپورت پشت سرهم بایدباشند شماره پورتهایی که میتوان به کاربرد میانه شماره پورتهای 1024-65535بایدباشد
سرایند RTP میتواند تا ۱۲ بایت ودرصورت نیاز میشود بابکارگیری قسمت اختیاری دادهای بیشتری را در سرآیند آن جایگذاری کرد
||http://tosinso.com/files/get/84993d71-4cfd-41fa-978f-94ea06740305||


ورژن:دوبیت است و ورژن آن رامشخص میکند
p (pading) :یک بیت وبرای  نشان دادن اینکه ایا دادهای اختیاری به بسته می افزاییم یانه به کارمیرود واین دادهای اختیاری نیز برای کارهای دیگر دیگر دراستفاده از الکورتیم های رمزگزاری نیز به کارمیرود.
X (extension): که نشان میدهد باشندگی(حضور) دادههای بیشتر میان سرآیند و دادهای ارسالی
CC (CSRC Count): جهار بیت که تعداد CSRC هارو.


M (Marker): یک بیت است ونشان میدهدداده ارتباط خاصی با برنامه کاربردی داره.
PT (Payload Type): هفت بیت وفرمت بار راتعیین میکندوتفسیرش با برنامه کاربردی ست
Sequence Number:شماره ترتیب شانزده بیت برای مشخص کردن شماره ترتیب بسته های ارسالی که گیرنده براساس ان شماره ترتیب بسته های دریافتی را کنارهم قرارمیدهد
Timestamp: :مهر زمانی است با 32بیت که به کارمیرود برای تواناساختن دریافت کنده برای بازپخش الگوها در فاصله زمانی مناسب وقتی که چندین رشته تصویریا صدا باشنده(حاضر) هستند مهر زمانی درهرکدام به صورت مستقل در هر رشته و ممکن است به همگام سازی مدیا وابسته نباشند
SSRC:سی  ودوبیت برای  شناسه منبع همگام ساز که به طور منحصربه فرد شناسیی میکنه منبع رشته رو.منبع هممگام ساز در درون همان نشست RTP نیز یکتاست
CSRC: آی دی های منبع کمک کننده که یکی یکی نام میبردند منبع های کمک کننده را برای رشته هایی که به وسیله منبع های چندگانه تولید شده اند
Extension header: (optional) The first 32-bit word contains a profile-specific identifier (16 bits) and a length specifier (16 bits) that indicates the length of the extension (EHL=extension header length) in 32-bit units, excluding the 32 bits of the extension header 

جه بهتر که کمی هم درباره جایگاه بسته های RTP درلایه سخن بگیم تانگاه شما به این موضوع بازتر بشه توضیحی نمیدم امایک عکس گویایی همه داستان ست.
||http://tosinso.com/files/get/8568d241-20d7-402b-b093-7c72a1cc5117||
این عکس هم تصویری نیکو در فکرشما به وجودمیاورد
||http://tosinso.com/files/get/6601d940-944d-4689-acfe-8d86777daba9||
خب من بنا رو بر شکل هاگذاشتم اماشکلهاای که روشن هستن وکسی روگیج نیمکند به مکانRTP و SIP در بالا دقت بکنید ببیند از udp و یا tcp برای کارشون به کارگیری میکنند و نیک نگاه کنید که Sip و Rtp ربطی به همدیگر ندارن وبسته های انها بدون دخالت هم ساخته میشوند
خب اینک فرمت بسته SIP که باید همه خانه های آن راهم تعریف کرد
||http://tosinso.com/files/get/9c640aa6-a634-466c-bf66-47ac83161439||

Version
The version field in SIP distinguishes SIP from IP and any other internet protocol that uses the same link layer frame as IP such as Stream Protocol.

Flow Label
The Flow Label is an expansion of the IP Service field. It is used to label packets as belonging to a particular traffic flow for which the server requires specific handling , for example real time service or non default quality of service

Payload Length
This specifies the length of the SIP packet. It does not include the header. This is a change from IP , where the receiver had to check that the payload length was not less than the header size , this is not necessary in SIP , and results in one less thing to be checked.

Payload Type
This uses the same values as the IP Protocol field. It specifies the type of the header immediately following the SIP header , such as TCP or UDP. It has been renamed to avoid confusion as to what is being referred to as the IP protocol - the protocol field or IP itself.

Hop Limit
The Hop Limit is set to some nonzero value , and decremented by one by each system that forwards the packet. The packet is discarded if the hop limit reaches zero. This is to prevent the packet getting stuck in a forwarding loop.Other uses include limiting the propagation of multicast packets, and it can also be used for diagnostic purposes. The time to live field in IP provided the same function, plus one extra one. This was to limit the amount of time that a packet spent in transit. This was discarded because it proved too costly to implement , and in some cases impossible to implement , for example in large subnets whose transit time is unpredictable. In practice many IP routers implemented time to live as hop limit , SIP legitimised this. Any higher level functions that cannot tolerate delivery delays , must provide their own method of recognising old packets.

Source Address
ادرسی 64بیتی است که ادرس فرستنده رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

Destination Address
ادرسی 64بیتی است که ادرس مقصد رو درخودش جای میده وsip هیچ محدودیتی بر روی ساختار کلاس اعمال نمی‌کند

مثالی از نام نویسی SIP با زبان سی شارپ
||http://tosinso.com/files/get/102e2f90-db97-4f8a-a515-4ffc1b308962||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Register
{
    class Program
    {
        private static ISoftPhone softphone;   // softphone object
        private static IPhoneLine phoneLine;   // phoneline object
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = sipusername;
            var displayName = sipdisplayname;
            var authenticationId = authenticationid;
            var registerPassword = Password;
            var domainHost = pbxip.voipprovider.com;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += sipAccount_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void sipAccount_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
                Console.WriteLine(Registration succeeded - Online!);
        }
    }
}
<c#>
زنگ خوردن با SIP در سی شارپ

||http://tosinso.com/files/get/f31ab12f-8008-4b5e-8169-d4475c33b3e6||
<c#>
using System;
using Ozeki.VoIP;
 
namespace SIP_Invite
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
        }
    }
}
<c#>

ارسال داده با سی شارپ
||http://tosinso.com/files/get/f7f5d2d9-1d3d-43f4-9120-3ed12f58b01e||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Microphone
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Microphone microphone;
        static MediaConnector connector;
        static PhoneCallAudioSender mediaSender;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            microphone = Microphone.GetDefaultDevice();
            mediaSender = new PhoneCallAudioSender();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        static void line_RegStateChanged(object sender, RegistrationStateChangedArgs e)
        {
            if (e.State == RegState.Error || e.State == RegState.NotRegistered)
                Console.WriteLine(Registration failed!);
 
            if (e.State == RegState.RegistrationSucceeded)
            {
                Console.WriteLine(Registration succeeded - Online!);
                CreateCall();
            }
        }
 
        static void CreateCall()
        {
            var numberToDial = 853;
 
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        static void SetupMicrophone()
        {
            connector.Connect(microphone, mediaSender);
            mediaSender.AttachToCall(call);
 
            microphone.Start();
 
            Console.WriteLine(The microphone is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupMicrophone();
        }
    }
}
<c#>

دریافت داده با سی شارپ
||http://tosinso.com/files/get/b985cb66-4364-4392-bc8d-1a6820bbefc9||
<c#>
using System;
using Ozeki.Media;
using Ozeki.VoIP;
 
namespace SDK_Speaker
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
        static Speaker speaker;
        static MediaConnector connector;
        static PhoneCallAudioReceiver mediaReceiver;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            speaker = Speaker.GetDefaultDevice();
            mediaReceiver = new PhoneCallAudioReceiver();
            connector = new MediaConnector();
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
                CreateCall();
            }
        }
 
        private static void CreateCall()
        {
            var numberToDial = 853;
            call = softphone.CreateCallObject(phoneLine, numberToDial);
            call.CallStateChanged += call_CallStateChanged;
            call.Start();
        }
 
        private static void SetupSpeaker()
        {
            connector.Connect(mediaReceiver, speaker);
            mediaReceiver.AttachToCall(call);
 
            speaker.Start();
            Console.WriteLine(The speaker is functioning.);
        }
 
        static void call_CallStateChanged(object sender, CallStateChangedArgs e)
        {
            Console.WriteLine(Call state: {0}., e.State);
 
            if (e.State == CallState.Answered)
                SetupSpeaker();
        }
    }
}
<c#>

رد تماس با سی شارپ
||http://tosinso.com/files/get/9a3dbbff-ee75-4544-b38e-cbc9a58d07f3||
<c#>
using System;
using Ozeki.VoIP;
 
namespace Reject_Incoming_Call
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = 858;
            var displayName = 858;
            var authenticationId = 858;
            var registerPassword = 858;
            var domainHost = 192.168.115.100;
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.IncomingCall += softphone_IncomingCall;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine(Error during SIP registration:  + ex);
            }
        }
 
        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!);
        }
 
        static void softphone_IncomingCall(object sender, VoIPEventArgs<IPhoneCall> e)
        {
            call = e.Item;
            call.Reject();
        }
    }
}
<c#>
using System;
using Ozeki.VoIP;
 
namespace Reject_Incoming_Call
{
    class Program
    {
        static ISoftPhone softphone;   // softphone object
        static IPhoneLine phoneLine;   // phoneline object
        static IPhoneCall call;
 
        private static void Main(string[] args)
        {
            // Create a softphone object with RTP port range 5000-10000
            softphone = SoftPhoneFactory.CreateSoftPhone(5000, 10000);
 
            // SIP account registration data, (supplied by your VoIP service provider)
            var registrationRequired = true;
            var userName = "858";
            var displayName = "858";
            var authenticationId = "858";
            var registerPassword = "858";
            var domainHost = "192.168.115.100";
            var domainPort = 5060;
 
            var account = new SIPAccount(registrationRequired, displayName, userName, authenticationId, registerPassword, domainHost, domainPort);
 
            // Send SIP regitration request
            RegisterAccount(account);
 
            // Prevents the termination of the application
            Console.ReadLine();
        }
 
        static void RegisterAccount(SIPAccount account)
        {
            try
            {
                phoneLine = softphone.CreatePhoneLine(account);
                phoneLine.RegistrationStateChanged += line_RegStateChanged;
                softphone.IncomingCall += softphone_IncomingCall;
                softphone.RegisterPhoneLine(phoneLine);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error during SIP registration: " + ex);
            }
        }
 
        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!");
        }
 
        static void softphone_IncomingCall(object sender, VoIPEventArgs<IPhoneCall> e)
        {
            call = e.Item;
            call.Reject();
        }
    }
}

نظرات