/* * Copyright 2016 the original author or authors. * @https://github.com/scouter-project/scouter * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package scouter.agent.batch.netio.data.net; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import scouter.agent.Logger; import scouter.agent.batch.Configure; import scouter.io.DataInputX; import scouter.io.DataOutputX; import scouter.net.NetCafe; import scouter.util.KeyGen; public class UdpAgent { static public boolean sendUdp(String IPAddress, int port, byte [] byteArray){ InetAddress server = null; try { server = InetAddress.getByName(IPAddress); return sendUdp(server, port, byteArray); } catch (Exception e) { e.printStackTrace(); } return false; } static public boolean sendUdp(InetAddress IPAddress, int port, byte [] byteArray){ DatagramSocket datagram = null; try { Configure conf = Configure.getInstance(); if (byteArray.length > conf.net_udp_packet_max_bytes) { return sendMTU(IPAddress, port, byteArray, conf.net_udp_packet_max_bytes); } datagram = new DatagramSocket(); DatagramPacket packet = new DatagramPacket(byteArray, byteArray.length); packet.setAddress(IPAddress); packet.setPort(port); datagram.send(packet); return true; } catch (Exception e) { e.printStackTrace(); } finally{ if(datagram != null){ try { datagram.close(); } catch(Exception ex){} } } return false; } static public boolean sendMTU(InetAddress IPAddress, int port, byte[] data, int packetSize) { try { if (IPAddress == null) return false; long pkid = KeyGen.next(); int availPacketSize = packetSize - 23; // Packet header size is 23 int totalPacketCnt; int total = data.length / availPacketSize; int remainder = data.length % availPacketSize; int num = 0; boolean isSuccess = true; totalPacketCnt = total; if(remainder > 0){ totalPacketCnt++; } for (num = 0; (isSuccess && num < total); num++) { isSuccess = SendMTU(IPAddress, port, pkid, totalPacketCnt, num, availPacketSize, DataInputX.get(data, num * availPacketSize, availPacketSize)); } if (isSuccess && remainder > 0) { isSuccess = SendMTU(IPAddress, port, pkid, totalPacketCnt, num, remainder, DataInputX.get(data, data.length - remainder, remainder)); } return isSuccess; } catch (IOException e) { Logger.println("A121","UDP", e); } return false; } static private boolean SendMTU(InetAddress IPAddress, int port, long pkid, int total, int num, int packetSize, byte[] data) throws IOException { Configure conf = Configure.getInstance(); DataOutputX out = new DataOutputX(); out.write(NetCafe.CAFE_MTU); out.writeInt(conf.getObjHash()); out.writeLong(pkid); out.writeShort(total); out.writeShort(num); out.writeBlob(data); return sendUdp(IPAddress, port, out.toByteArray()); } }