Czat internetowy

0

Witam!!

Na stronie www.code-maker.prv.pl znalazlem taki program czat (http://www.kodmaker.obywatel.pl/download/czat.rar) no i polaczylem sie ze swoim komputerem - wszystko dzialalo fajnie, no ale chcialem sie poloczyc z innym komputerem przez internet i pisze ciagle mi "bledny adres".... adres na 100% jest dobry... no ale jaka jest przyczyna bledu?? moze mi ktos powiedziec?

0

może ta osoba jest za ruterem?

0

No to co ja mam w takim przypadku zrobic? Przeciez jakos gg, tlen, wp dziala.... wiec on się łączy z tymi komputerami bo normalnie rozmawiamy.... więc możecie mi powiedzieć jak to zrobić? Masz racje ja jestem za routerem (nie wiem czy ta druga osoba także) no ale gg działa więc na pewno da się to zrobć, pytanie tylko "jak??"

0

Jeżeli 2 osoby są za NAT'em (różnymi) to niewiele możesz zrobić (dlatego, m.in. nie możesz przesyłać między takimi dwoma kompami plików przez gg). A gg, tlen i te inne działają dlatego, że komunikatory nie łączą się ze sobą bezpośrednio, tylko za pomocą serwera, który ma publiczne IP.

0

Czyli wystarczy, że plik serwer.exe umieszcze gdzieś na publicznym IP i będzie ten komunikator dobrze działał, tak? (plik klient.exe nie musi być na publicznym IP)

0

Tak.

0
Krolik napisał(a)

Tak.

Definitywnie "tak"?? :/ . Nie da się tego jakoś tak "ominąć"??

0

Skontaknowałem się z autorem strony internetowej www.code-maker.prv.pl i

Spoon napisał(a)

Da sie ale to malo prakyczne jest:) Musisz poprosic administratora żeby
przekierował jeden wybrany przez ciebie port na twój komputer (bedzie
wiedzial o co chodzi) Wtedy z twoim kompem będzie można sie połączyć z
zewnątrz ale tylko na tym jednym wybranym porcie, inaczej sie niestety
nie da.

No i ten administrator dał mi port 1550, no ale teraz pokazuje mi się komunikat "bind - blad". a ten komunikato pojawia się wtedy gdy:

if ( bind(soc_serwer,(struct sockaddr *)&sin, sizeof sin ) == SOCKET_ERROR )
{
MessageBox(uchwyt,"bind - błąd","błąd",MB_OK);
WSACleanup();
return FALSE;
}

Musze jeszcze dodać, że na wszystkich innych portach ten błąd się nie pojawia....

0

A dodaj przed funkcją bind takie coś:

int so_optval=1;
setsockopt(soc_serwer, SOL_SOCKET, SO_REUSEADDR, &so_optval, sizeof(so_optval) )

0

NIe wyskakuje ten błąd, ale pojawia się "błedny adres"

0

Nie wiem czy tamten kod na stronie jest w pełni poprawny, ale próbuj dalej np :

zamień linijkę

sin.sin_addr.s_addr = INADDR_ANY;

na:

sin.sin_addr.s_addr = inet_addr("127.0.0.1");

W ten sposób serwer będzie dowiązany do IP twojego kompa.

0

Niestety ciągle pojawia mi się "błędny adres".... nie wiem co jest....

0

Gdzie pojawia się ten błędny adres - po wywołaniu bind na serwerze czy connect na kliencie. Sprawdzałeś czy rzeczywiście porty, przez które chcesz się łączyć masz w stanie nasłuchiwania (polecenie netstat -a).?

0

albo przetestuj wszystko takim programikiem:
Ethereal
jest crossplatformowy i to jest chyba najlepszy jaki znam sniffer i tam latwo mozesz wszystko sprawdzic..

PS. Mam nadzieje ze nie uzywasz FireWalla z SP2 WinXP tylko np outpost lub ZoneAlarm

0
NXX napisał(a)

Gdzie pojawia się ten błędny adres - po wywołaniu bind na serwerze czy connect na kliencie.

Po wywołaniu connect na kiencie

Sprawdzałeś czy rzeczywiście porty, przez które chcesz się łączyć masz w stanie nasłuchiwania (polecenie netstat -a).?

Wpisałem i oto co mi się pokazało:

Protokół: TCP
Aderes lokalny: KRZYS:1550
Obcy adres: KRZYS:0
Stan: Nasłuchiwanie

Póżniej, gdy połączyłem się ze samym sobą (z mojego komputera do mojego) to pokazałą mi się jeszcze jedna linijka (tuż pod):

Protokół: TCP
Aderes lokalny: KRZYS:1550
Obcy adres: KRZYS:1233
Stan: Nasłuchiwanie

Przepisałem to choć nie wiem co znaczyć ten "obcy adres".... strzelając to jest za pomocą jakiego portu się łączy (Adres lokalny:1550 - czyli port)... ale dalczego adres obcy: 1233? :/

0

Przepraszam coś mi się zacieło i nie wyświetliło odpowiedz na to:

NXX napisał(a)

Gdzie pojawia się ten błędny adres - po wywołaniu bind na serwerze czy connect na kliencie.

Na kliencie ... po wywołaniu conect

0

Jeśli w obcym adresie jest twój localhost (KRZYS) to znaczy, że uruchomiony jest jakiś klient na twoim kompie.
Zrób jeszcze tak - wstaw i dowiedz się jaką wartość int zwraca funkcja WSAGetLastError() tuż po wywołaniu connect() i podaj ten numer.

0

Przepraszam, że tak długo nie odpisywałem....

No więc pomyliłem się bo błąd pojawia się po wywołaniu :
if (sin.sin_addr.s_addr==INADDR_NONE)
{
host=gethostbyname(adres);
}
else
{
host=gethostbyaddr((const char *)&sin.sin_addr,sizeof(struct in_addr), AF_INET);
}
if(host==NULL)
{
MessageBox(uchwyt,"bledny adres","FewF",MB_OK);
return false;
}

a nie pow wywołaniu connect.... :/

0
Osiolek napisał(a)

Skontaknowałem się z autorem strony internetowej www.code-maker.prv.pl i

Spoon napisał(a)

Da sie ale to malo prakyczne jest:) Musisz poprosic administratora żeby
przekierował jeden wybrany przez ciebie port na twój komputer (bedzie
wiedzial o co chodzi) Wtedy z twoim kompem będzie można sie połączyć z
zewnątrz ale tylko na tym jednym wybranym porcie, inaczej sie niestety
nie da.

No i mam pytanie : czy jak ta druga osoba nie ma tego portu przekierowanego (ja mam) to zcy to będzie działać, bo jak nie to już wiemy co było przyczyną :P

0

Już porzuciłem ten pomysł aby to połączyć , bo za dużo z tym problemów :/, ale pomyślałem że można się połączyć do gadu-gadu. Więc zrobiłem prorgam kótry ma za zadanie połączenie się z portem 8074:

#include <iostream.h>
#include <winsock2.h>
main()
{
SOCKET sock;
sock = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in sin;
sin.sin_addr.s_addr = inet_addr("192.168.0.90");
sin.sin_family = AF_INET;
sin.sin_port=htons(8074);
if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))==SOCKET_ERROR)
cout << "Polaczenie nie powiodlo sie";
else cout << "Polaczenie powiodlo sie";
getchar();
}

I nie łączy się - program chyba jest dobrze. to więc czyżby to było coś z komputerem moim?

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