mcgroupimpl.java
来自「这是一个基于java编写的torrent的P2P源码」· Java 代码 · 共 712 行 · 第 1/2 页
JAVA
712 行
public int
getControlPort()
{
return( control_port );
}
protected boolean
interfaceSelected(
NetworkInterface ni )
{
if ( selected_interfaces != null && selected_interfaces.length > 0 ){
boolean ok = false;
for (int i=0;i<selected_interfaces.length;i++){
if ( ni.getName().equalsIgnoreCase( selected_interfaces[i] )){
ok = true;
break;
}
}
return( ok );
}else{
return( true );
}
}
protected boolean
validNetworkAddress(
final NetworkInterface network_interface,
final InetAddress ni_address )
{
try{
this_mon.enter();
Set set = (Set)current_registrations.get( network_interface );
if ( set == null ){
return( false );
}
return( set.contains( ni_address ));
}finally{
this_mon.exit();
}
}
public void
sendToGroup(
byte[] data )
throws MCGroupException
{
try{
Enumeration x = NetworkInterface.getNetworkInterfaces();
while( x != null && x.hasMoreElements()){
NetworkInterface network_interface = (NetworkInterface)x.nextElement();
if ( !interfaceSelected( network_interface )){
continue;
}
Enumeration ni_addresses = network_interface.getInetAddresses();
boolean ok = false;
while( ni_addresses.hasMoreElements()){
InetAddress ni_address = (InetAddress)ni_addresses.nextElement();
if ( !( ni_address instanceof Inet6Address || ni_address.isLoopbackAddress())){
ok = true;
break;
}
}
if ( !ok ){
continue;
}
try{
MulticastSocket mc_sock = new MulticastSocket(null);
mc_sock.setReuseAddress(true);
try{
mc_sock.setTimeToLive( TTL );
}catch( Throwable e ){
if ( !ttl_problem_reported ){
ttl_problem_reported = true;
adapter.log( e );
}
}
mc_sock.bind( new InetSocketAddress( control_port ));
mc_sock.setNetworkInterface( network_interface );
// System.out.println( "sendToGroup: ni = " + network_interface.getName() + ", data = " + new String(data));
DatagramPacket packet = new DatagramPacket(data, data.length, group_address.getAddress(), group_port );
mc_sock.send(packet);
mc_sock.close();
}catch( Throwable e ){
if ( !sso_problem_reported ){
sso_problem_reported = true;
adapter.log( e );
}
}
}
}catch( Throwable e ){
throw( new MCGroupException( "sendToGroup failed", e ));
}
}
public void
sendToGroup(
String param_data )
throws MCGroupException
{
try{
Enumeration x = NetworkInterface.getNetworkInterfaces();
while( x != null && x.hasMoreElements()){
NetworkInterface network_interface = (NetworkInterface)x.nextElement();
if ( !interfaceSelected( network_interface )){
continue;
}
Enumeration ni_addresses = network_interface.getInetAddresses();
InetAddress an_address = null;
while( ni_addresses.hasMoreElements()){
InetAddress ni_address = (InetAddress)ni_addresses.nextElement();
if ( !( ni_address instanceof Inet6Address || ni_address.isLoopbackAddress())){
an_address = ni_address;
break;
}
}
if ( an_address == null){
continue;
}
try{
MulticastSocket mc_sock = new MulticastSocket(null);
mc_sock.setReuseAddress(true);
try{
mc_sock.setTimeToLive( TTL );
}catch( Throwable e ){
if ( !ttl_problem_reported ){
ttl_problem_reported = true;
adapter.log( e );
}
}
mc_sock.bind( new InetSocketAddress( control_port ));
mc_sock.setNetworkInterface( network_interface );
byte[] data = param_data.replaceAll("%AZINTERFACE%", an_address.getHostAddress()).getBytes();
// System.out.println( "sendToGroup: ni = " + network_interface.getName() + ", data = " + new String(data));
DatagramPacket packet = new DatagramPacket(data, data.length, group_address.getAddress(), group_port );
mc_sock.send(packet);
mc_sock.close();
}catch( Throwable e ){
if ( !sso_problem_reported ){
sso_problem_reported = true;
adapter.log( e );
}
}
}
}catch( Throwable e ){
throw( new MCGroupException( "sendToGroup failed", e ));
}
}
protected void
handleSocket(
NetworkInterface network_interface,
InetAddress local_address,
DatagramSocket socket,
boolean log_on_stop )
{
long successful_accepts = 0;
long failed_accepts = 0;
int port = socket.getLocalPort();
try{
// introduce a timeout so that when a Network interface changes we don't sit here
// blocking forever and thus never realise that we should shutdown
socket.setSoTimeout( 30000 );
}catch( Throwable e ){
}
while(true){
if ( !validNetworkAddress( network_interface, local_address )){
if ( log_on_stop ){
adapter.trace(
"group = " + group_address +"/" +
network_interface.getName()+":"+
network_interface.getDisplayName() + " - " + local_address + ": stopped" );
}
return;
}
try{
byte[] buf = new byte[PACKET_SIZE];
DatagramPacket packet = new DatagramPacket(buf, buf.length );
socket.receive( packet );
successful_accepts++;
failed_accepts = 0;
receivePacket( network_interface, local_address, packet );
}catch( SocketTimeoutException e ){
}catch( Throwable e ){
failed_accepts++;
adapter.trace( "MCGroup: receive failed on port " + port + ":" + e.getMessage());
if (( failed_accepts > 100 && successful_accepts == 0 ) || failed_accepts > 1000 ){
adapter.trace( " too many failures, abandoning" );
break;
}
}
}
}
protected void
receivePacket(
NetworkInterface network_interface,
InetAddress local_address,
DatagramPacket packet )
{
byte[] data = packet.getData();
int len = packet.getLength();
// System.out.println( "receive: add = " + local_address + ", data = " + new String( data, 0, len ));
adapter.received(
network_interface,
local_address,
(InetSocketAddress)packet.getSocketAddress(),
data,
len );
}
public void
sendToMember(
InetSocketAddress address,
byte[] data )
throws MCGroupException
{
DatagramSocket reply_socket = null;
// System.out.println( "sendToMember: add = " + address + ", data = " +new String( data ));
try{
reply_socket = new DatagramSocket( null );
reply_socket.setReuseAddress(true);
reply_socket.bind( new InetSocketAddress( group_port ));
DatagramPacket reply_packet = new DatagramPacket(data,data.length,address);
reply_socket.send( reply_packet );
}catch( Throwable e ){
throw( new MCGroupException( "sendToMember failed", e ));
}finally{
if ( reply_socket != null ){
try{
reply_socket.close();
}catch( Throwable e ){
}
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?