diff options
Diffstat (limited to 'src/net.cpp')
| -rw-r--r-- | src/net.cpp | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/src/net.cpp b/src/net.cpp index 7b2ef83..b5d12d0 100644 --- a/src/net.cpp +++ b/src/net.cpp | |||
| @@ -554,7 +554,10 @@ void ThreadBtfAccept(void* parg) | |||
| 554 | string strHost = strMeeting.substr(0, colon); | 554 | string strHost = strMeeting.substr(0, colon); |
| 555 | int nPort = atoi(strMeeting.substr(colon + 1).c_str()); | 555 | int nPort = atoi(strMeeting.substr(colon + 1).c_str()); |
| 556 | 556 | ||
| 557 | // Blocks until a client is paired to us (or the relay drops us) | 557 | // Returns as soon as the relay has us listed -- it does not wait for a |
| 558 | // dial. That distinction is the whole point: we have to be advertised | ||
| 559 | // before anyone can dial us, so registering and waiting cannot be the | ||
| 560 | // same call. | ||
| 558 | btf::RvSocket rv = btf::RvServiceRegister(strHost.c_str(), (unsigned short)nPort, pk); | 561 | btf::RvSocket rv = btf::RvServiceRegister(strHost.c_str(), (unsigned short)nPort, pk); |
| 559 | if (fShutdown) | 562 | if (fShutdown) |
| 560 | { | 563 | { |
| @@ -564,13 +567,29 @@ void ThreadBtfAccept(void* parg) | |||
| 564 | } | 567 | } |
| 565 | if (rv == btf::RV_INVALID) | 568 | if (rv == btf::RV_INVALID) |
| 566 | { | 569 | { |
| 570 | LogPrint("net", "rendezvous: could not register at %s, trying another\n", | ||
| 571 | strMeeting.c_str()); | ||
| 567 | iRelay++; // this relay is down/attacked -> try the next one | 572 | iRelay++; // this relay is down/attacked -> try the next one |
| 568 | Sleep(3000); | 573 | Sleep(3000); |
| 569 | continue; | 574 | continue; |
| 570 | } | 575 | } |
| 571 | // Registered OK: advertise THIS relay in our descriptor so clients dial | 576 | |
| 572 | // us here, and keep using it (iRelay unchanged) until it fails. | 577 | // Registered. Advertise THIS relay now, while we are listed and before |
| 578 | // anybody dials -- a descriptor naming it is what makes a dial possible | ||
| 579 | // at all. Keep using it (iRelay unchanged) until it fails. | ||
| 573 | BtfSetActiveRelay(strMeeting); | 580 | BtfSetActiveRelay(strMeeting); |
| 581 | LogPrint("net", "rendezvous: registered at %s, waiting for a dial\n", | ||
| 582 | strMeeting.c_str()); | ||
| 583 | |||
| 584 | // Now block for someone to arrive. | ||
| 585 | if (!btf::RvServiceWaitPaired(rv)) | ||
| 586 | { | ||
| 587 | btf::RvClose(rv); | ||
| 588 | LogPrint("net", "rendezvous: %s dropped us before any dial, re-registering\n", | ||
| 589 | strMeeting.c_str()); | ||
| 590 | continue; | ||
| 591 | } | ||
| 592 | |||
| 574 | btf_socket_t hSocket = btf::BtfServiceWrap(rv, sk); | 593 | btf_socket_t hSocket = btf::BtfServiceWrap(rv, sk); |
| 575 | if (hSocket == INVALID_SOCKET) | 594 | if (hSocket == INVALID_SOCKET) |
| 576 | continue; | 595 | continue; |