#################################################################################### #Copyright (c) 2009, AAACast Project #All rights reserved. # #Redistribution and use in source and binary forms, with or without modification, # are permitted provided that the following conditions are met: # #*Redistributions of source code must retain the above copyright notice, this list # of conditions and the following disclaimer. #*Redistributions in binary form must reproduce the above copyright notice, this # list of conditions and the following disclaimer in the documentation and/or # other materials provided with the distribution. #*Neither the name of the AAACast Project nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. #THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # #The views and conclusions contained in the software and documentation are # those of the authors and should not be interpreted as representing official # policies, either expressed or implied, of the AAACast Project. #################################################################################### require 'socket' require 'csv' require 'thread' include Math require 'date' require "tcpserver.rb" host = 'localhost' listenPort = "8266" knownNodeList={} nearestNodeList={} geoStruct=Struct.new(:latitude,:longitude) #地理情報構造体(:緯度:経度) hostStruct=Struct.new(:ipAddress,:tcpPort,:udpPort) #ホスト情報(:IPAddress:Port) $controlTiming=60 mutexForKnownNodeList=Mutex.new mutexForNearestNodeList=Mutex.new answers=[] def cal_sqrt(a,b,c,d) answer=sqrt((a-b)**2 + (c-d)**2) return answer end #knownNodeListから1時間以上更新されていないエントリを削除するスレッド deleatOldEntryOfKnownNodeListThread=Thread.start do p "start deleatOldEntryOfKnownNodeListThread" while TRUE p "run del!" mutexForKnownNodeList.synchronize{ knownNodeList.delete_if{|kNL_hostInfo,kNL_value| kNL_value[1] < (Time.now - 3600) } } sleep($controlTiming*2) end end Thread.start do p "start TCPServerThread" TcpServer.start(listenPort) do |lSock| while(line=lSock.gets) # p line # p line.chop! CSV.parse(line){|row| #クライアントからの入力(IPAddress,Port,Latitude,Longitude)を","でパース case row[0] when "SendMyInfo" hostInfo=hostStruct.new(row[1],row[2],row[3]) hostGeoInfo=geoStruct.new(row[4],row[5]) print("new node=",row[1],":",row[2],":",row[3],"::",row[4],",",row[5],"\n") nearestNodeList.clear answers.clear mutexForKnownNodeList.synchronize{ knownNodeList.each do |key,value| #入力されたノードに対する距離を計算 ans=cal_sqrt(value[0].latitude.to_i,row[3].to_i,value[0].longitude.to_i,row[4].to_i) answers<