3 Mart 2015 Salı

UDP Socket Kullanımı

UDP Soketi Açmak
UDP soketi hem almak hem de göndermek için kullanılabilir.
Java
DatagramSocket Sınıfı yazısına taşıdım.

UDP ile veri göndermek
C
int s = socket (AF_INET,SOCK_DGRAM,IPPROTO_UDP);
struct sockaddr_in address;
memset (&address,sizeof(address));
address.sin_family = AF_INET;
address.sin_port = htons (portNo);
address.sin_addr.s_addr = inet_addr ("MyIP");
int result = sendto (s,data,dataLength,0,(sockaddr*)address,sizeof(address));
if (result != dataLength) {//error}    
sendto belirtilen socketi kullanarak, belirtilen adrese veriyi gönderir. Sonuç olarak kaç byte gönderdiğini döner. 4. parametrenin hep 0 olarak kullanıldığını gördüm. 0 dışından başka bir örnek görmedim.
int len;
len=sendto(s, buff,sizeof(buff), 0, (struct sockaddr*)&addr, sizeof(addr));
Java
Java'da UDP verisi göndermek için veriyi ve adresi birleştiren DatagramPacket sınıfını kullanmak gerek.
Örnek:
//Create a datagram
byte tempBuffer1[] = new byte[10];
InetAddress address = InetAddress.getByName(SERVER_IP);
DatagramPacket packet1 = new DatagramPacket(tempBuffer1, tempBuffer1.length, address, serverPort);

//Send an empty packet
DatagramSocket ds = new DatagramSocket(clientPort);
ds.send(packet1); 
QT
QUdpSocket sınıfı kullanılıyor. Qt'de Java'daki gibi  veriyi ve adresi birleştiren DatagramPacket sınıfını mevcut değil.
Örnek:
QByteArray bytes;
QUdpSocket udpSocket;
udpSocket.writeDatagram(bytes, QHostAddress(ip), port.toInt()); 
UDP ile veri almak
Şekilde UDP ile veri almak için izlenen akış verilmiş. UDP ile de bind yapmak gerekiyor
UDP Server uygulamalarında veri akıp akmadığını göstermek için alınan paket sayısını, tarihi vs. gösteren bir alan konulması iyi olur.

C
SOCKET s;
char buf [10];
int len = sizeof (buf);// eğer len atanmaz ise recv buffer belleğin boyunu bilemez ve -1 döner.
recv (s,buf,len,0);
 
Java
DatagramSocket Sınıfı yazısına taşıdım.

C#
UdpClient sınıfı kullanılıyor. Bu sınıf esasında Socket sınıfını wrap eder ve Socket sınıfının Bind metodunu kendi çağırır.
UdpClient listener = new UdpClient (portno);

//The IPEndPoint will allow you to read datagrams sent from any source.
IPEndPoint remoteEP = new IPEndPoint (IPAddress.Any,0);
// Blocks until a message returns on this socket from a remote host.
byte [] data = listener.Receive (ref remoteEP);
Eğer istenirse Poll yöntemi de kullanılabilir.
UdpClient listener = new UdpClient (portno);
IPEndPoint remoteEP = new IPEndPoint (IPAddress.Any,0);
int PollInMicroSeconds = 1000;
bool DataReady = listener.Client.Poll (PollInMicroSeconds,SelectMode.SelectRead);
if (DataReady){
    byte [] data = listener.Receive (ref remoteEP);
}
Eğer Socket kullanılmak istenirse aşağıdaki gibi yapılabilir. Ancak bu durumda Bind() metodunu kendimizin çağırması gerekir.

//Create socket
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//Bind
IPEndPoint myEP = new IPEndPoint(IPAddress.Any, 0);
s.Bind(myEP);

//Receive
byte[] receiveBytes = new Byte[1024];
IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
res = s.ReceiveFrom(receiveBytes, ref recEP);

QT
Örnek:
QByteArray bytes;
QUdpSocket udpSocket;
udpSocket.bind (2048);
udpSocket.readDatagram(data.data(),data.size());

UDP ile Broadcast Veri Göndermek
Directed ve Limited Broadcast arasındaki farka dikkat etmek gerekir.

255.255.255. limited broadcast'tir ve router paketin yerel ağdan dışarı çıkmasına izin vermez.

192.168.1.255 ise directed broadcast'tir ve router gerekli ayarı yapılmışsa paketi bir sonraki ağa geçirir.


UDP ile Broadcast Veri Almak
Java
DatagramSocket Sınıfı yazısına taşıdım.



Hiç yorum yok:

Yorum Gönder