Dziwna sytuacja z komunikatorem LAN(wykonany w Borlandzie,testowany na sieci LAN i VLAN Hamachi)

0

Witam :)
Temat zakładam bo natknąłem sie na dziwny błąd komunikatora który sam napisalem pare tygodni temu(a może coś jest nie tak w moim systemie,ale o tym zaraz).
Sprawa ma sie tak że komunikator(kod w załączniku) w sieci LAN działa znakomicie,testowałem go na dwóch róznych komputerach podpiętych do jednego routera i wszystko smiga pięknie...zabawa zaczyna sie kiedy chce wyslac wiadomość przez VLAN postawioną za pomocą hamachi.
Osoba po drugiej stronie robi to bez problemu,ale moje wiadomosci nie chca dojść za nic w swiecie(używamy tej samej wersji komunikatora,bez podziału na client server a przy polaczenie LAN tez byla to ta sama wersja)Dwa razy przeprowadzałem test z dwoma innymi komputerami oraz moim ,pewnie przeoczyłem jakąś głupote...Nie mam jak przetestować programu na dwóch innych komputerach (bo nie są one moje)(ciekawe czy byłyby w stanie pisać)
Ps.
-to mój pierwszy program internetowy
-adres IP który jest wpisywany na starcie,jest wymagany przez borlanda
-zamieniałem porty miejscami i nic to nie dało
-zapora odpada,bo nadawca mógł to wyslać,a ja mogłem odebrać
-myśle że może gdzieś w kodzie jest coś co sprawia że wiadomości można wysylać tylko do mnie,ale nigdzie tego nie widze
co ciakawe przy połączeniu LAN wszystko działało...

Wybaczcie chaos w poscie,ale nigdy nie miałem talentu do wypowiedzi pisemnej :P
Jeśli zapomniałem dodać jakąś ważną informacje,dajcie znać to natychmiast dopisze...

Pozdrawiam i dziekuje za doczytanie do końca :)

kod
(nie jest to kod z zadania ,mojego autorstwa,wiec chyba nikt sie nie obrazi jak wstawie w tekst )

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent
Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
ServerSocket1->Port = 24;
ClientSocket1->Port = 23;
ClientSocket1->Host= "25.154.47.179";
ServerSocket1->Active = True;
ClientSocket1->Active = True;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
ServerSocket1->Active = False;
ClientSocket1->Active = False;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
WPrzychEdit->Text = Socket->ReceiveText();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::WyslijButtonClick(TObject *Sender)
{
if( ClientSocket1->Active )
ClientSocket1->Socket->SendText(WWychEdit->Text);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::ZmienIPButtonClick(TObject *Sender)
{
ClientSocket1->Active = False;
ClientSocket1->Host = IPOdbiorcyEdit->Text;
ClientSocket1->Active = True;
}
//---------------------------------------------------------------------------

1

Proponuję następujące zmiany:

  1. W funkcji FormCreate():
//ServerSocket1->Port = 24;
   //ClientSocket1->Port = 23;
    //ClientSocket1->Host= "25.154.47.179";
    ServerSocket1->Active = false;  //True;
    ClientSocket1->Active = false; //True;
  1. W funkcji ZmienIPButtonClick():
ClientSocket1->Active = False;
        ClientSocket1->Host = IPOdbiorcyEdit->Text;
        ClientSocket1->Port = StrToInt(PortOdbiorcyEdit->Text);  //<---
        ClientSocket1->Active = True 

Wymaga to dodania kontrolki TEdit i ustawienia jej nazwy na PortOdbiorcyEdit.

  1. Dodanie dodatkowego pola edycyjnego i przycisku, aby można było ustalić port i aktywować serwer.
    Przycisk nazwij AktywujSerwerButton, a pole edycyjne - PortSerweraEdit.
    W zdarzeniu OnClik dodanego przycisku wpisz:
ServerSocket1->Active = false;
ServerSocket1->Port = StrToInt(PortSerweraEdit->Text);
ServerSocket1->Active = true;
  1. Po uruchomieniu programiku.
    Aby odbierać wiadomości wpisz w polu PortSerweraEdit numer portu i zatwierdź przyciskiem AktywujSerwerButton. Nadawca wiadomości będzie musiał wpisać ten numer w polu PortOdbiorcyEdit.
    Aby wysłać wiadomość w polu IPOdbiorcyEdit wpisz jego IP lub nazwę, a w polu PortOdbiorcyEdit wpisz numer portu, do którego jest podłączony serwer odbiorcy i zatwierdź przyciskiem ZmienIPButton.

Uprzedzam, że jest to rozwiązanie prowizoryczne. Może służyć jako podstawa do stworzenia aplikacji, ale absolutnie taką nie jest.

0

Dziekuje Panu za odpowiedź. Naniosłem już poprawke...postaram sie jak najszybciej ją sprawdzić i napisze jaki jest efekt ^^
Patrząc na to rozwiązanie przyszedł mi do głowy pomysł na małe usprawnienie(najpierw to program musi zadziałać,ale moge w sumie załatwić to,,przy okazji'' :) )Nie wie pan może czy karta sieciowa magazynuje pakiety które przyszły kiedy program nie nasłuchiwał?Bo jesli tak to mógłbym za pomocą timerów zrobic tak żeby program przez pół sekundy był nastawiony na odbieranie a drugie pół na wysyłanie...różnica czasu dla rozmówcy byłaby nie zauważalna,a rozmowa mogłaby przebiegać bez przeszkód...Co pan o tym sądzi?
Dziękuje za odpowiedź i Pozdrawiam :)

0

Niestety...problem występuje nadal...Kolega wysyła wiadomosci normalnie,a ja nie jestem mu w stanie wysłać nic...

0

Niestety...problem występuje nadal...

Trudno powiedzieć co jest nie tak. Dopisz w zdarzeniu OnError komponentu ClientSocket poniższy kod.Powinno to ułatwić zdiagnozowanie błędu.

AnsiString opis;
switch(ErrorEvent)
{
  case eeConect:
  case eeAccept:
    opis = "Nie udało się połączyć z serwerem. Błąd - ";
  break;
  default:
    opis = "Jakiś błąd - ;
}
ShowMessage(opis + IntToStr(ErrorCode));
ErrorCode = 0;

(...)Bo jesli tak to mógłbym za pomocą timerów zrobic tak żeby program przez pół sekundy był nastawiony na odbieranie a drugie pół na wysyłanie...różnica czasu dla rozmówcy byłaby nie zauważalna,a rozmowa mogłaby przebiegać bez przeszkód...Co pan o tym sądzi?

Funkcjonalność, o której mówisz już jest. Domyślnie sockety odbierają i wysyłają asynchronicznie. Zapoznaj się z dokumentacją. Opis wszystkich funkcji zdarzeń i właściwości znajdziesz w pomocy dołączonej do C++ Buildera.
Najłatwiej to zaznaczyć na formie ikonę reprezentującą socket i wcisnąć klawisz F1.

0

Dzikuje panu ...Postaram sie jak najszybciej to sprawdzić... nie bardzo wiem co musiałbym jeszcze opisac żeby ułatwić diagnoze,nie będe w koncu opisywać systemu bajt po bajcie,ale może są jeszcze jakieś dziwne popularne kruczki i haczyki typu Firewall.Zobacze co sie stanie jak uzyje do tego innej biblioteki :) Jak znadje troche czasu to sie tym zajme i opisze wynik...
Pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1