[C++] Telnet


(Kalin 93) #1

Witam.

Mam problem z klientem telnetu. Mianowicie, jeśli komunikuje się miedzy dwoma komputerami to jest ok.

Ale jak chce się połączyć np z serwerem IRC, to otrzymuje 1-wszy pakiet od serwera, ale kolejnych już nie.

Poniżej przedstawiam kod

#include 

#include 

#include 

#include 


using namespace std;


SOCKET Polaczenie;


DWORD WINAPI Wysylanie ()

{

	cout << "Uruchomiono watek Wysylajacy\n";

	string sPolecenie;

	if (Polaczenie == INVALID_SOCKET) cout << "Blad!!!";

	for (;;)

	{

		getline (cin,sPolecenie);

		if (send (Polaczenie,sPolecenie.c_str(),sPolecenie.length()+1,NULL) == 0) cout << "Blad wyslania !";

	}

}


int main ()

{

	WORD wersja = MAKEWORD (2,0);

	WSADATA wsaData;

	if(!WSAStartup(wersja, &wsaData))

	{

		cout << "WSA uruchomione poprawnie!\n";

	}

	if (LOBYTE (wsaData.wVersion) != 2 && HIBYTE (wsaData.wVersion != 0)) cout << "Uruchomiono niepoprawna wersje WSA !";

	Polaczenie = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

	if (Polaczenie == INVALID_SOCKET)

	{

		cout << "Nie mozna utworzyc socketa!";

		WSACleanup ();

	}

	hostent *host=0;

	string sAdresSerwera = "krakow.irc.pl";

	sockaddr_in server;

	int nPort = 6667;

	memset (&server,0,sizeof (server));

	server.sin_family = AF_INET;

	server.sin_port = htons ((u_short)nPort);

	server.sin_addr.s_addr = inet_addr (sAdresSerwera.c_str());

	if (server.sin_addr.s_addr == INADDR_NONE)

	{

		host = gethostbyname (sAdresSerwera.c_str());

		if (host == NULL) cout << "Nie moge skonwertowac adresu!\n";

		CopyMemory(&server.sin_addr, host->h_addr_list[0], host->h_length);


	}

	if (!connect (Polaczenie,(sockaddr*)&server,sizeof (server)))

	{

		cout << "Polaczono !\n";

	};

	DWORD ThreadID;

	HANDLE hWysylanie = CreateThread (0,0,(LPTHREAD_START_ROUTINE)Wysylanie,0 ,NULL,&ThreadID);

	char cBufor [10241];

	for (;;)

	{

		memset (cBufor,0,sizeof (cBufor));

		recv (Polaczenie,cBufor,10240,NULL);

		cout << cBufor << "\n";

	}

	_getch();

}

([alex]) #2

Serwer IRC to nie zupełnie telnet, ma swój protokół po otrzymaniu pierwszego pakietu klient IRC musi wysłać odpowiednie informacje w odpowiednim formacie na które serwer czeka w przypadku braku takich informacji po jakimś czasie może nawet chamsko odłączyć klienta, biblioteka Indy w takich przypadkach wywala wyjątek: EIdConnClosedGracefully :smiley:


(Kalin 93) #3

Ale gdy łącze się przez zwykłego klienta telnetu (windowsowego) to jest OK.

Mogę wysyłać polecenia i serwer IRC na nie odpowiada a w moim programie no niedokońca :wink:


([alex]) #4

Hmm, to spróbuj wysyłać bez znaku końcowego:

send (Polaczenie,sPolecenie.c_str(),sPolecenie.length()/*+1*/,NULL) [/code]

EDIT: Już wiem, zapomniałeś o enterze.

[code=php]      getline (cin,sPolecenie);
      sPolecenie+="\n";
      if (send (Polaczenie,sPolecenie.c_str(),sPolecenie.length(),NULL) == 0) ... 


(Kalin 93) #5

No i teraz działa :slight_smile: Wielkie dzięki :slight_smile: