コード例 #1
0
ファイル: SimpleDHT.cs プロジェクト: kazuki/p2pncs
            void KBR_Callback(IAsyncResult ar)
            {
                RoutingResult rr = _dht.KeyBasedRouter.EndRoute (ar);
                if (rr.RootCandidates == null || rr.RootCandidates.Length == 0) {
                    //TimeSpan time = DateTime.Now.Subtract (_start);
                    _result = new GetResult (_key, null, rr.Hops);
                    Done ();
                    return;
                }
                _hops = rr.Hops;

                int count;
                object msg;
                AsyncCallback callback;
                if (_getMethod) {
                    count = Math.Min (_dht.NumberOfReplicas, rr.RootCandidates.Length);
                    msg = new GetRequest (_key, _typeId);
                    callback = GetRequest_Callback;
                } else {
                    count = Math.Min (_dht.NumberOfReplicas, rr.RootCandidates.Length);
                    msg = _putReq;
                    callback = PutRequest_Callback;
                }

                _getInquires = count;
                for (int i = 0; i < count; i ++) {
                    if (rr.RootCandidates[i].EndPoint == null) {
                        if (_getMethod) {
                            lock (_getLock) {
                                _getInquires --;
                                object[] ret = _dht.LocalHashTable.Get (_key, _typeId, _dht._mergerMap[_typeId]);
                                if (ret != null || _getInquires == 0) {
                                    _result = new GetResult (_key, ret, rr.Hops);
                                    Done ();
                                    return;
                                } else {
                                }
                            }
                        } else {
                            _dht.LocalPut (_putReq.Key, _putReq.LifeTime, _putReq.Value, null);
                            Done ();
                        }
                    } else {
                        _dht.MessagingSocket.BeginInquire (msg, rr.RootCandidates[i].EndPoint, callback, rr.RootCandidates[i].EndPoint);
                    }
                }
            }
コード例 #2
0
ファイル: SimpleDHT.cs プロジェクト: kazuki/p2pncs
 void PutRequest_Callback(IAsyncResult ar)
 {
     _dht.MessagingSocket.EndInquire (ar);
     _result = null;
     Done ();
 }
コード例 #3
0
ファイル: SimpleDHT.cs プロジェクト: kazuki/p2pncs
 void GetRequest_Callback(IAsyncResult ar)
 {
     EndPoint remoteEP = (EndPoint)ar.AsyncState;
     GetResponse res = _dht.MessagingSocket.EndInquire (ar) as GetResponse;
     lock (_getLock) {
         if (_result != null)
             return;
         _getInquires --;
         if (res == null || res.Values == null) {
             if (_getInquires != 0)
                 return;
             _result = new GetResult (_key, null, _hops);
         } else {
             for (int i = 0; i < res.Values.Length; i ++) {
                 IPutterEndPointStore epStore = res.Values[i] as IPutterEndPointStore;
                 if (epStore != null && epStore.EndPoint == null)
                     epStore.EndPoint = remoteEP;
             }
             _result = new GetResult (_key, res.Values, _hops);
         }
     }
     Done ();
 }