این بخش  ای برای برنامه نویسی TCP / IP با استفاده از API sockets است. (سوکت همچنین می تواند برای کار با سایر پروتکل های شبکه مانند IPX / SPX و Appletalk مورد استفاده قرار گیرد API سوکت استاندارد در ابتدا در دنیای یونیکس توسعه یافت، اما به سیستم عامل منتقل شده است 
معمولا هنگامی که کسی به "TCP / IP" اشاره می کند،یعنی به کل مجموعه پروتکل ها اشاره دارند، همه آنها بر اساس پروتکل اینترنت ("IP") است. بر خلاف یک شبکه واحد، که هر کامپیوتر به طور مستقیم به هر رایانه دیگر متصل است، "اینترانت" (یا "اینترنت") مجموعه ای از یک یا چند شبکه است. این شبکه ها همگی به هم متصل می شوند تا یک شبکه مجازی بزرگتر ایجاد کنند. هر میزبان در این شبکه مجازی می تواند داده ها را با هر میزبان دیگر مبادله کند

هنگامی که یک سیستم با استفاده از پروتکل اینترنت داده ها را بر روی شبکه می فرستد، داده های طولانی داده های ثابت داده شده با نام datagrams ارسال می شوند. (این گاهی اوقات به عنوان "بسته ها" خوانده می شود) Datagram شامل یک "header" است که به دنبال "بخش داده" است. هدر حاوی اطلاعات مربوط به آدرس، بسیار شبیه یک پاکت است که از طریق سرویس پستی محلی خود ارسال می کنید. هدر حاوی "مقصد" و "بازگشت به" آدرس، و همچنین اطلاعات دیگر استفاده شده توسط پروتکل اینترنت است. یکی دیگر از شباهت بین IP و سرویس پستی شما این است که هر بسته ای که ارسال می شود، به مقصد نمی رسد. هرچند هر تلاش برای رسیدن به آن وجود دارد، گاهی اوقات datagram ها در حمل و نقل گم شده و یا تکرار می شوند. علاوه بر این، اگر شما 5 ارسال دیتاگرام را در یک بار ارسال کنید، هیچ تضمینی وجود ندارد که آنها به مقصد خود در یک زمان یا همان سفارش می رسند.
آنچه واقعا مورد نیاز است یک راه مستقیم برای اطمینان از اینکه همه بسته هایی که ارسال می شوند به مقصد خود می رسند. هنگامی که آنها وارد می شوند، اطمینان حاصل کنید که آنها در دنباله ای مشابه هستند و تمام داده های تکراری حذف شده اند. برای حل این مشکل، پروتکل کنترل انتقال (TCP) ایجاد شد. آن را در کنار IP اجرا می کنند
TCP یک پروتکل ارتباطی است که به این معنی است که وقتی می خواهید از آن استفاده کنید، ابتدا باید "اتصال برقرار کنید". برای انجام این کار، یک برنامه باید نقش "سرور" را بازی کند و برنامه دیگری باید نقش "مشتری" را بگیرد. سرور برای اتصالات منتظر می ماند و مشتری یک اتصال ایجاد می کند. هنگامی که این اتصال برقرار شد، داده ها به طور قابل اعتماد در هر دو جهت ارسال می شوند تا اتصال قطع شود. به منظور اجازه دادن به چندین اتصال TCP به و از یک میزبان مشخص، اعداد "پورت" ایجاد می شوند. هر بسته TCP حاوی "پورت مبدا" و "پورت مقصد" است که برای تعیین برنامه ای که تحت هر کدام از وظایف سیستم، دریافت اطلاعات است، استفاده می شود.
دو پروتکل دیگر که از طریق IP استفاده می شود وجود دارد. آنها "پروتکل دیتاگرام کاربر (UDP)" و "پروتکل پیام های کنترل اینترنت" (ICMP) هستند.
UDP شبیه به TCP است، به جز اینکه داده ها یک datagram در یک زمان ارسال می شوند. تفاوت عمده بین دیتاگرام های UDP و دیتاگرام های "خام" IP این است که UDP شماره های پورت را به بسته ها اضافه می کند. به این ترتیب، مانند TCP، بسیاری از وظایف در سیستم می توانند همزمان از UDP استفاده کنند. UDP معمولا زمانی استفاده می شود که شما اطلاع دارید و  فقط می خواهید یک مقدار کوچک از اطلاعات (یک بسته کوچک) را در یک زمان بفرستید، و بنابراین شما کل هزینه اضافی TCP را ندارید
ICMP از طریق پروتکل اینترنت به طور داخلی برای تبادل پیام های تشخیصی و خطا استفاده می شود. به عنوان مثال، هنگامی که شما تلاش می کنید به یک پورت در یک دستگاه از راه دور متصل شوید، و آن دستگاه تصمیم به قطع اتصال خود می کند، به آن نیاز دارد تا به شما بگویم که اتصال از کار رفته است. این کار با ارسال پیام های ICMP انجام می شود. شما هرگز نیازی به نوشتن یا دریافت پیام های ICMP به طور مستقیم ندارید، آنها همیشه توسط پشته TCP / IP اداره می شوند. آنها به شدت "پروتکل پیام کنترل" هستند.
DNS یک پایگاه داده بزرگ و توزیع شده است که حاوی مقادیری بین اسامی قابل خواندن  (مانند "inventory.acme.com") و آدرس های IP (مانند "199.124.84.12") هنگامی که شما از کامپیوتر برای آدرس IP برای "موجودی" درخواست می کنید. acme.com "، این مراحل زیر را دنبال می کند:
بررسی می کند که آیا نام میزبان در جدول میزبان رایانه محلی است. (در AS / 400، شما می توانید 'CFGTCP' را تایپ کنید و انتخاب 10 برای کار با جدول میزبان را انتخاب کنید) اگر آن را برای "inventory.acme.com" پیدا می کند، این را به برنامه شما می دهد. اگر نه، گام دوم را دنبال می کند.
 تلاش می کند با یک سرور DNS تماس بگیرد. (سرور DNS ممکن است در همان دستگاه یا در دستگاه دیگری در شبکه باشد، مهم نیست)
سرور DNS ممکن است قبلا آدرس IP که با "inventory.acme.com" مرتبط است را بداند. هر زمان که نام جدیدی به نظر می رسد، آن را برای یک دوره زمانی "caches" می کند. بنابراین، اگر این نام خاص در حافظه پنهان آن باشد، می تواند آن را به درستی بازگرداند. اگر نه، به مرحله بعدی می رود.
از آنجا که میلیونها نفر  نام میزبان در جهان وجود دارد، شما نمیتوانید همه آنها را در یک سرور ذخیره کنید. در عوض، نامها توسط یک سلسله مراتب کامل سرورهای DNS خدمت می کنند. هر سطح از سلسله مراتب مربوط به یک جزء متفاوت نام میزبان است. اجزاء با دوره ها جدا می شوند.
سرور DNS از سرور "acme" برای آدرس میزبان "موجودی" می پرسد. این آدرس دریافت می شود و توسط DNS سرور شما ذخیره می شود.
سرانجام، سرور DNS این آدرس را به برنامه شما ارسال می کند.
سوکت ، ترکیبی از یک آدرس IP و پورت TCP ویا پورت UDP است . یک برنامه ، سوکتی را با مشخص نمودن آدرس IP مربوط به کامپیوتر و نوع سرویس ( TCP برای تضمین توزیع اطلاعات و یا UDP (و پورتی که نشاندهنده برنامه است، مشخص می نماید. آدرس IP موجود در سوکت ، امکان آدرس دهی کامپیوتر مقصد را فراهم و پورت مربوطه ، برنامه ای را که داده ها برای آن ارسال می گردد را مشخص می نماید. 
برنامه نویسی شبکه همواره یک ویژگی کلیدی سیستم عاملهای Windows مایکروسافت میباشد
خب نحوه ساخت یه برنامه چت از نوعudp رو براتون اموزش میدم در پایان هم سورس رو میزارم
تو حالت عادی باید یه برنامه سمت سرور بنویسیم و یه کلاینت اما این برنامه بصورت یکپارچه و تک سرور و کلاینت هست
ابتدا 5 تا تکست باکس و 3 تا باتنو یه لیست باکس به فرم اضافه میکنیم

ابتدا می بایست فضای نامهای زیر را با استقاده از using  به کامپایلر سی شارپ اضافه کنیم

using System;
using System.Net;
using System.Net.Sockets;


یک شیء از کلاس سوکت و ای پی و یه بافر به صورت سراسری ایجاد می کنیم

 Socket soc;
        EndPoint EndLocal, EndRemot;
        byte[] Bufer;

ابتدا در لود فرم نحوه اختصاص ای پی  به تکست باکس رو مینویسیم البته متد در یافت ای پی رو نیز براتون قرار میدم

 soc = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            soc.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress,true);

            //دریافت ای پی
            txtlocalip.Text = GetLocalIp();
            txtfriendip.Text = GetLocalIp(); 


 private string GetLocalIp()
        {
            IPHostEntry Getip;
            Getip = Dns.GetHostEntry(Dns.GetHostName());
            foreach (IPAddress ip in Getip.AddressList)
            {
                if (ip.AddressFamily == AddressFamily.InterNetwork)

                    return ip.ToString();

            }
            return "127.0.0.1";
        }


AddressFamily.InterNetwork به معنای این است که از شبکه ای استفاده می کنیم که دارای IP نسخه ۴ است. SocketType.Stream برای سوکت هایی است که می خواهند به صورت Stream داده ها را تبادل کنند. ProtocolType.Tcp که نوع پروتکل ما را مشخص می کند
خب داخل باتن اتصال این کدها رو اضافه میکینم

 //دریافت سوکت
            EndLocal = new IPEndPoint(IPAddress.Parse(txtlocalip.Text),Convert.ToInt32(txtlocalport.Text));
            soc.Bind(EndLocal);
            //اتصال به سیستم مقصد 
            EndRemot = new IPEndPoint(IPAddress.Parse(txtfriendip.Text),Convert.ToInt32(txtfriendport.Text));
            soc.Connect(EndRemot);

            //ارتباط با پورت مشخص شده
            Bufer = new byte[1500];
            soc.BeginReceiveFrom(Bufer, 0, Bufer.Length, SocketFlags.None, ref EndRemot, new AsyncCallback(MessageCallBack),Bufer);

یه متد برای دریافت پیام مینویسیم

 private void MessageCallBack (IAsyncResult aResult)
        {
            try
            {
                byte[] recievdata = new byte[1500];
                recievdata = (byte[])aResult.AsyncState;

                //تبدیل بایت به پیام      
                ASCIIEncoding aEncod = new ASCIIEncoding();
                string recievemsg = aEncod.GetString(recievdata);

                //اضافه کردن پیام دریافتی به لیست باکس
                listboxmessage.Items.Add("Guest:>" + recievemsg);

                Bufer = new byte[1500];
                soc.BeginReceiveFrom(Bufer, 0, Bufer.Length, SocketFlags.None, ref EndRemot, new AsyncCallback(MessageCallBack), Bufer);
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.ToString());
            }
          
        }
و نهایتا متد ارسال پیام رو مینویسیم
 ASCIIEncoding Encod = new ASCIIEncoding();
            byte[] sendmsg = new byte[1500];
            sendmsg = Encod.GetBytes(txtsendmessage.Text);

            //ارسال پیام بصورت بایت
            soc.Send(sendmsg);

            //اضافه کردن پیام به لیست باکس
            listboxmessage.Items.Add("Me:>"+txtsendmessage.Text);
            txtsendmessage.Text = "";

امیدوارم استفاده کرده باشید


سورس چت در سی شارپ