1 22 package org.xsocket.datagram; 23 24 import java.net.DatagramSocket ; 25 import java.net.SocketException ; 26 import java.net.SocketOptions ; 27 import java.util.HashMap ; 28 import java.util.Map ; 29 30 import static java.net.SocketOptions .*; 31 32 33 40 public final class DatagramSocketConfiguration { 41 42 private final Map <Integer , Object > options = new HashMap <Integer , Object >(); 43 44 45 void setOptions(DatagramSocket socket) throws SocketException { 46 for (java.util.Map.Entry<Integer , Object > entry : options.entrySet()) { 47 setOption(socket, entry.getKey(), entry.getValue()); 48 } 49 } 50 51 Map <String , Object > toOptions() { 52 Map <String , Object > result = new HashMap <String , Object >(); 53 54 for (Integer optionKey : options.keySet()) { 55 if (optionKey == SO_SNDBUF) { 56 result.put(IEndpoint.SO_SNDBUF, options.get(optionKey)); 57 58 } else if(optionKey == SO_REUSEADDR) { 59 result.put(IEndpoint.SO_REUSEADDR, options.get(optionKey)); 60 61 } else if(optionKey == SO_RCVBUF) { 62 result.put(IEndpoint.SO_RCVBUF, options.get(optionKey)); 63 64 } else if(optionKey == IP_TOS) { 65 result.put(IEndpoint.IP_TOS, options.get(optionKey)); 66 67 } 68 } 69 70 return result; 71 } 72 73 74 75 static void setOption(DatagramSocket socket, int optID, Object value) throws SocketException { 76 switch (optID) { 77 78 case SO_TIMEOUT: 79 socket.setSoTimeout((Integer ) value); 80 break; 81 82 case SO_SNDBUF: 83 socket.setSendBufferSize((Integer ) value); 84 break; 85 86 case SO_REUSEADDR: 87 socket.setReuseAddress((Boolean ) value); 88 break; 89 90 case SO_RCVBUF: 91 socket.setReceiveBufferSize((Integer ) value); 92 break; 93 94 case IP_TOS: 95 socket.setTrafficClass((Integer ) value); 96 break; 97 98 default: 99 break; 100 } 101 } 102 103 104 static Object getOption(DatagramSocket socket, int optID) throws SocketException { 105 switch (optID) { 106 case SO_TIMEOUT: 107 return socket.getSoTimeout(); 108 109 case SO_SNDBUF: 110 return socket.getSendBufferSize(); 111 112 case SO_REUSEADDR: 113 return socket.getReuseAddress(); 114 115 case SO_RCVBUF: 116 return socket.getReceiveBufferSize(); 117 118 case SO_LINGER: 119 case IP_TOS: 120 return socket.getTrafficClass(); 121 122 default: 123 throw new RuntimeException ("unsupported option id: " + optID); 124 } 125 } 126 127 128 133 public void setSO_TIMEOUT(Integer i) { 134 options.put(SocketOptions.SO_TIMEOUT, i); 135 } 136 137 138 143 public void setSO_SNDBUF(Integer i) { 144 options.put(SocketOptions.SO_SNDBUF, i); 145 } 146 147 148 153 public void setSO_RCVBUF(Integer i) { 154 options.put(SocketOptions.SO_RCVBUF, i); 155 } 156 157 158 163 public void setSO_REUSEADDR(Boolean b) { 164 options.put(SocketOptions.SO_REUSEADDR, b); 165 } 166 167 168 173 public void setIP_TOS(Integer i) { 174 options.put(SocketOptions.IP_TOS, i); 175 } 176 } 177 | Popular Tags |