24 Kasım 2019 Pazar

Socket Sınıfı

Giriş
Şu satırı dahil ederiz.
using System.Net.Sockets;
Socket sınıfı TCP/UDP istemci veya TCP/UDP sunucu işlemleri için kullanılabilir.

Bu sınıf çok alt seviye kaldığı için istemci olarak UdpClient, TcpClient sunucu olarak ta
TcpListener tercih edilebilir.

Constructor - AddressFamily + SocketType + ProtocolType
Örnek
TCP için şöyle yaparız.
Socket serverSocket =
new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(new IPEndPoint(IPAddress.Any, PORT_NO));
serverSocket.Listen(4); 
Örnek
UDP için şöyle yaparız.
new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Accept metodu
Şöyle yaparız.
Socket socketClient = serverSocket.Accept();
Available Alanı
Okumak için kaç byte'ın hazır olduğunu belirtir. Şöyle yaparız.
if (socket.Available > 0) {...}
BeginAccept metodu
Metodu şöyle çağırırız.
serverSocket.BeginAccept(onAccept, serverSocket);
Metoda verilen callback içinde eğer listener socket nesnesi varsa kısaca şöyle yaparız.
void onAccept(IAsyncResult ar){
  Socket handler = listener.EndAccept(ar);
  IPEndPoint ipEndPoint = handler.RemoteEndPoint as IPEndPoint;
  ...
}
Eğer yoksa uzun hali şöyle
void onAccept(IAsyncResult ar)
{
  try
  {
    Socket handler = ((Socket)ar.AsyncState).EndAccept(ar);
    ...
  }
  catch
  {
    ...
  }
  finally
  {
    listener.BeginAccept(onAccept, serverSocket);
   }
}
BeginReceive metodu
Şöyle yaparız.
socket.BeginReceive(buffer, 0, 1024, SocketFlags.None, 
                    new AsyncCallback(onReceive), socket);
Callback şöyledir.
void onReceive(IAsyncResult ar)
{
  int receive = socket.EndReceive(ar);
  if (receive > 0)
  {...}
}
BeginSend metodu
Şöyle yaparız.
byte[] packet = ...;
socket.BeginSend(packet, 0, packet.Length, 0, sentData, null);
Callback şöyledir.
void sentData(IAsyncResult ar)
{
  try
  {
    socket.EndSend(iAr);
  }
  catch
  {
    ...
  }
}
Close metodu
Şöyle yaparız.
socket.Close();
Connect metodu
Bu metod exception atar.
try
{
  IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 100);
  socket.Connect(remoteEndPoint);
}
catch (SocketException)
{
  ...
}
TCP istemci socketinde şöyle yaparız.
int port = 9090;
IPHostEntry ipHostInfo = Dns.GetHostEntry("MyHostName");
    
IPAddress ipAddress = ipHostInfo.AddressList[0];


//End point of the host where the socket will be connected
IPEndPoint remoteEndPoint = new IPEndPoint(ipAddress, port);

// Create a clientSocket that connects to host
Socket socket = new Socket(...);
socket.Connect(remoteEndPoint);
Connected Alanı
Şöyle yaparız.
if (socket.Connected){...}
Disconnect metodu
Şöyle yaparız.
socket.Disconnect(true);
ExclusiveAddressUse Alanı
Ne olduğunu anlamadım.
socket.ExclusiveAddressUse = false;
Listen metodu
Şöyle yaparız.
socketServer.Listen(1);
NoDelay Alanı
Şöyle yaparız.
bool disableNagleAlgorithm = true;socket.NoDelay = disableNagleAlgorithm;
Poll metodu
Şöyle yaparız.
if (socket.Poll(1, SelectMode.SelectRead)) {...}
Receive metodu
Örnek
Şöyle yaparız.
byte[] buffer = new byte[1024];
int result = socketClient.Receive(buffer);
Örnek
Şöyle yaparız.
byte[] responseByte = new byte[1024];
int result = socket.Receive(responseByte, client.Available, SocketFlags.None);
SafeHandle Alanı
Açıklaması şöyle.
You should use a SafeHandle when you are directly managing an unmanaged resource.
With Socket, there is an underlying unmanaged resource, but that's handled by the Socket class.
Örnek
Şöyle yaparız.
Socket socket = ...;
SafeSocketHandle _handle = socket.SafeHandle;
Send metodu
Şöyle yaparız.
byte[] data = ...;
socket.Send(data);
SetSocketOption - ReuseAddress
Sunucu socket'lerde kullanılır.
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.ReuseAddress, true);
SetSocketOption - Multicast Grubuna Girmek
UDP socketlerde kullanılır.
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, 
                       new MulticastOption("MCAST_IP", "LOCAL_IP"));
SetSocketOption - SendTimeout
Şöyle yaparız.
socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.SendTimeout,200);
Shutdown metodu
Şöyle yaparız.
socket.Shutdown(SocketShutdown.Both);


Hiç yorum yok:

Yorum Gönder