MFC Send() OnReceive() Connect()

0

Wywołuje AfxSocketInit(); w InitInstance()

Treść dialogu:

void CtestDlg::TorManage(void)
	{
	socket_tor.Create();
	socket_tor.Connect(_T("127.0.0.1"),9051);
         errorss =socket_tor.Connect(_T("127.0.0.1"),9051)
		errorss = GetLastError();
	send(socket_tor,"cokolwiek",strlen("cokolwiek"),0);

	}
void CtestDlg::OnBnClickedButtonTor()
	{
	TorManage();
	}

socket_tor jest zadeklarowany w klasie CtestDlg:

CSockety socket_tor;

errorss zwraca 10035 z GetLastError(); i 0 z Connect.

wysyłając cokolwiek przez funkcje send nie otrzymuje żadnej odpowiedzi z lokalnego serwera, natomiast korzystając z putty albo innego klienta wszystko gra. o co chodzi?

Jeszcze tutaj implementacja klasy dziedziczącej z CAsyncSocket:

class CSockety : public CAsyncSocket
{

public:
	virtual void OnAccept(int nErrorCode){};
	virtual void OnClose(int nErrorCode){};
	virtual void OnConnect(int nErrorCode){};
	virtual void OnOutOfBandData(int nErrorCode){};
	virtual void OnReceive(int nErrorCode){}; 
	virtual void OnSend(int nErrorCode){}; 
};

Mm OnConnect jest wywoływana po komendzie Connect tutaj tylko dla uproszczenia bez żadnej zawartości, tak samo jak OnSend- postawiłem breakpointy i są wywoływane. niestety serwer nic nie odsyła tak jakby nie wiedział gdzie odesłać. Macie jakies pomysły?

0
  1. dlaczego dwa razy próbujesz połączyć się z serwerem? Ten błąd 10035 jest pewnie z tego powodu.
  2. wysyłanie też jest źle, wysyła się metodą Send klasy CAsyncSocket, a z tego co widzę wywołujesz funkcję send z winsock
0

Tam źle skopiowałem nie ma tej pierwszej linijki.
Co do reszty tak wygląda wlasciwa klasa:

void CtestDlg::TorManage(void)
	{
	socket_tor.Create();
	errorss =socket_tor.Connect(_T("127.0.0.1"),9051);
		errorss = GetLastError();
		errorss= socket_tor.Send("cokolwiek",strlen("cokolwiek"),0);
		errorss = GetLastError();
	}

I dalej nie smiga ;) Można zmieniac jakies opcje przy connect? setsockopt ? Jak wyglądalaby implementacja Poll w moim przypadku?, żeby pozbyc się tego błędu 10035?

0

Tu masz opis tego kodu błędu http://msdn.microsoft.com/en-us/library/ms740668%28v=vs.85%29.aspx

Problem polega najprawdopodobniej na tym, że wywołujesz Send zanim socket zdąży się połączyć - dlatego dostajesz WSAEWOULDBLOCK. Send powinieneś wywołać dopiero po połączeniu się socket'u - nie chce mi się sprawdzać w dokumentacji, ale bodajże po połączeniu odpalana jest metoda OnSend, która daje znać, że już można wysyłać.

0

No ale ile może się łaczyć -> kilkadziesiąt milisekund? zrobiłem również tak, że pakiet send wysyłałem przy pomocy przycisku, czyli jakieś kilka sekund/minut po połączeniu. OnSend faktycznie jest wysyłane przy Connect. Zresztą server jest na hoście lokalnym więc żadne kosmiczne opóźnienia nie wchodzą w grę ;/ Co jeszcze może nie grać? Jak to rozwiązać? Dobre kilkanaście godzin nad tym siedzę i powinienem mieć to już dawno za sobą, a tu takie niespodzianki...

Zaraz po wysłaniu Connect widzę wyraźnie że ustanowiono nowe połączeniu. Server zauważa, że chcę coś wysłać(Send), ale nie potrafi "przeczytać" tego co mu wysyłam? Tak jakby to nie był dobry format? Nie wiem jak to inaczej wytłumaczyć ludzkim językiem ;q

Edit:
Klient tworzony przez moje okienko działa zazwyczaj na wysokich portach, podczas gdy klient w PuTTy czy innych telnetach to porty tak do 4000. Czy to może miec jakieś znaczenie?
A Może powinienem dopisac także server, który będzie nasłuchiwał...?

Edit2:
A może chodzi o komunikacje strumieniową albo datagramy? jak uwzględnić SOCK_DGRAM lub SOCK_STREAM w funkcji Connect/Create? Jak sprawdzić z której korzystam?

Edit3:
Z tego co widzę Create jest domyślnie połączeniem strumieniowym...

Edit4:
Zrobiłem to samo na porcie PuTTy, również nie działa. Jakies inne pomysły?
Pozdrawiam

0

A z czym się łączysz? Jakiś własny serwer stoi u Ciebie pod tym portem 9051? Jakaś konkretna usługa tam nasłuchuje na połączenie?
Jakie kody błędów dostajesz? Pokaż też jak teraz wygląda kod.

0

W Pythonie nie ma problemu,a tutaj w c++ jedna WIELKA ściana. Odsyła coś do mnie, widzi że ja coś mu wysłałem, ale tak jakby "nie rozumie". Coś nie teges z komendą send... sendTo też nie działa. Może powinienem zejść na niższy poziom, zamiast korzystać z CAsyncSocket... no ale bez sensu że nie działa normalnie.

void CtestDlg::BorManage(void)
	{
	errorss =socket_bor.Create(2555,SOCK_STREAM,FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);	


	errorss = socket_bor.Connect(_T("localhost"),8041);
		errorss = GetLastError();

	}
void CtestDlg::OnBnClickedButtonBor()
	{
	BorManage();
	}

void CtestDlg::OnBnClickedButton1()
	{
	 errorss =socket_bor.SendTo("authenticate \"h\"",strlen("authenticate \"h\""),2555,_T("127.0.0.1"),MSG_OOB);

	}

void CtestDlg::OnBnClickedButton2()
	{
	//AfxMessageBox((LPCTSTR) (errorss));
	socket_tor.ShutDown(2);
	socket_tor.Close();
	}

Klasa:

class CSockety : public CAsyncSocket
{

public:
	void SetParentDlg(CDialog *pDlg);
	virtual void OnAccept(int nErrorCode){};
	virtual void OnClose(int nErrorCode){};
	virtual void OnConnect(int nErrorCode){};
	virtual void OnOutOfBandData(int nErrorCode){};
	virtual void OnReceive(int nErrorCode){}; 
	virtual void OnSend(int nErrorCode){}; 
};

Może wsparcie przez TeamViewera ;p? Napisz PM

errorss =socket_tor.Create(2555,SOCK_STREAM,FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);	//errors=1 po wywołaniu
errorss = socket_tor.Connect(_T("localhost"),9051); //errors = 10035- ale ok bo potem wywołuje OnConnect i OnSend, czyli stworzyło "tunel".
errorss =socket_tor.SendTo("zuthenticate \"h\"",strlen("zuthenticate \"h\""),2555,_T("127.0.0.1"),MSG_OOB); // errors = 16 - też dobrze bo ten numer oznacza ilość przesłanych bitów. ALE: nie zostaje wywołana OnSend, także w przypadku zwykłego Send.

Funkcja OnClose tez nie jest wywoływana, gdy zamykam połączenie. Nie jestem pewien, ale przy PuTTY równiez błędna komenda skutkuje w Rozłączeniu(Disconnect) z Torem, dopóki się nie zaloguje poprawnie przez authenticate.
0

Na pewno ma być wysyłana wiadomość z flagą MSG_OOB? W tym wypadku do wysyłania lepiej użyć zwykłego Send.
Po użyciu SendTo/Send metoda OnSend nie jest wywoływana. Jeżeli serwer coś odpowiada to powinna być wywołana OnReceive.
OnClose zostanie wywołana jeżeli to druga strona zamknie połączenie.
Może jednak przesyłasz nie to co trzeba?

0

Tzn. tak - wrzuciłem authentication do funkcji inline OnSend(), która jest wywoływana, gdy serwer jest gotowy do przyjmowania danych:

	virtual void OnSend(int nErrorCode){this->Send("authenticate \"h\"",strlen("authenticate \"h\""));}; 

Nawet jeśli wysłane zapytanie jest błędne tzn.:

  1. po authenticate jest złe hasło -> powinienem otrzymać wiadomość ala: "awww błędne hasło, spróbuj ponownie"
  2. pierwsza wiadomośc nie rozpoczyna się od authenticate tylko np "trele morele" to otrzymam wiadomość: " potrzebna autoryzacja belblebel"

Z flagą czy bez flagi dalej serwer nie rozumie co do niego mówię ;d Mam mole chyba i mi zjadają pakiety idk ;q

0

Jaka jest składnia tego polecenia authenticate? Może spróbuj jeszcze na końcu wysłać mu \r\n lub samo \n? Jak wysyłasz authenticate "h" to serwer nic nie odpowiada?

//edit: Ewentualnie możesz jeszcze odpalić WireShark'a połączyć się przez putty i zobaczyć co przy logowaniu leci przez sieć. Zobaczysz jak dokładnie ma wyglądać taka wiadomość. Ogólnie wygląda na to, że coś nie do końca dobre polecenie wysyłasz - serwer chyba dalej czeka na ciąg dalszy.

0

Haha mistrzu ;) I kto ma wątpliwości, że w Polsce nie rodzą się geniusze ;/? Niech zatknie nos i usta i się udusi...
http://snpr.cm/YLjGNT.jpg
http://snpr.cm/eiNQcg.jpg

Piękne 250 OK :D

Czyli każde wyrażenie niezakończone \r i \n zostanie zignorowane przez Tor'a? Spotkałeś się z tym wczesniej czy to zależy od implementacji serwera?
Nawet OnReceive zostało wywołane ;)

0

Nie tyle zostanie zignorowane tylko nie będzie wiedział, czy już dostał całe polecenie czy jeszcze nie. Teraz znalazłem dokładniejsze info na ten temat: https://svn.torproject.org/svn/torctl/trunk/doc/howto.txt punkt 3.

//tak się zainteresowałem tematem bo mam zamiar zaimplementować właśnie na tych socketach przynajmniej część protokołu GG - jak się do tego zbiorę... kiedyś... :D

0

No Tor jest genialny ;) Więc życze powodzenia. Zobaczymy jeszcze czy nie stanę gdzieś na socketach ;d Jeśli dostanę jedną wiadomość i zostanie wywołana funkcja OnReceive to dopóki nie wyczyszcze buforu Receive() nie będę otrzymywać kolejnych powiadomień?

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