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
Java'da UDP verisi göndermek için veriyi ve adresi birleştiren DatagramPacket sınıfını kullanmak gerek.
Örnek:
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:
Ş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.
//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:
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.
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);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.
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}
int len;
len=sendto(s, buff,sizeof(buff), 0, (struct sockaddr*)&addr, sizeof(addr));
JavaJava'da UDP verisi göndermek için veriyi ve adresi birleştiren DatagramPacket sınıfını kullanmak gerek.
Örnek:
//Create a datagramQT
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);
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;UDP ile veri almak
QUdpSocket udpSocket;
udpSocket.writeDatagram(bytes, QHostAddress(ip), port.toInt());
Şekilde UDP ile veri almak için izlenen akış verilmiş. UDP ile de bind yapmak gerekiyor.
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);Eğer istenirse Poll yöntemi de kullanılabilir.
//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);
UdpClient listener = new UdpClient (portno);Eğer Socket kullanılmak istenirse aşağıdaki gibi yapılabilir. Ancak bu durumda Bind() metodunu kendimizin çağırması gerekir.
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);
}
//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