Problem med eget telnetprogram

Permalänk
Medlem

Problem med eget telnetprogram

Jag försöker skriva ett program som fungerar ungefär som telnet. Jag ska ta emot data från en IP-adress (som jag hårdkodat). Sen är tanken att programmet ska lägga upp en fil på en webserver så att man kan se indatat på Internet, än så länge saknas den delen och jag har gjort vad jag hoppas är en utskrift i prompten av indatat. Men när jag kör .exe filen jag får av Visual Studio så kommer fönstret bara upp en kort stund, jag har ingen chans att hinna se om det fungerar. Det är möjligt att det finns fundamentala fel, hjälp mig, här är koden:

#include "stdafx.h" #pragma comment(lib, "Ws2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsaData; int wsaret=WSAStartup(0x101,&wsaData); SOCKET conn; conn=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); unsigned long addr; addr=inet_addr("10.1.0.1"); hostent *hp; hp=gethostbyaddr((char*)&addr,sizeof(addr),AF_INET); int y; y = 1; char *buff; struct f; while(y=recv(conn,buff,512,0)) { printf(buff); } closesocket(conn); WSACleanup(); }

och här är meddelandet från build, ett fel:

1>------ Build started: Project: TCPClient, Configuration: Release Win32 ------ 1>Compiling... 1>TCPClient.cpp 1>Linking... 1>Generating code 1>c:\...\tcpclient.cpp(25) : warning C4700: uninitialized local variable 'buff' used 1>Finished generating code 1>Embedding manifest... 1>Build log was saved at "file://c:\...\BuildLog.htm" 1>AmazingTCPClient - 0 error(s), 1 warning(s) ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Permalänk
Medlem

Det är väl meningen att din buffert, buff, ska kunna innehålla data. Nu deklarerar du bara en tom pekare, och reserverar inte något minne. Om du vill att den ska innehålla t.ex. max 512 byte åt gången får du deklarera den som en char-array:

char buff[512];

Permalänk
Medlem

Det hjälpte mig att köra debugging i Visual Express, fick tidigare ett fel men det är borta nu.

Jag får fortfarande bara upp dos-prompten en kort stund när jag kör den riktiga .exe-filen.

Kan jag ansluta till programmet från en annan datorn så att jag kan testa skicka data genom hyperterminalen fast jag kör programmet i debug? När jag kör debuggen får jag in en ström "data", det är ett konstigt tecken, olika varje gång, följt av bindesstreck och sedan semikolon, detta upprepas i oändlighet.

Permalänk
Medlem

testa kör programmet från kommandotolken!

Permalänk
Medlem

I kommandotolken försvinner inte rutan, men det händer heller inget. Jag provar att lägga in följande efter att jag skriver ut buff:

printf("test");

Men det blir inte någon utskrift.

Så programmet avslutas fortfarande direkt, jag vill att det ska stå på och skriva ut mottaget data tills dess att jag väljer att avsluta. (Har ju inte lagt in något avslutningsvillkor och tanken är att programmet alltid skall köras så det behövs inte, kan krasha det när jag ska stänga av.)

Permalänk

Om du vill hinna se vad som händer i .exe-filen kan du lägga till system("pause)"; efter den punkt du vill kolla (oftast precis innan avslut av scriptet). För att komma runt varningen bör du nog initiera variabeln den klagar på! Fyll den med någon siffra (förslagsvis 1 eller 0) i initieringen, detta värde ändras ju ändå när den används!

Sedan vet jag inte riktigt hur det är med VC, då jag ännu inte lyckats få den att kompilera en körbar .exe som jag kan använda utan debuggern, utan måste kompilera med ett annat program...

Observera att jag är relativ nybörjare inom området och det jag säger KAN vara total bs, men det är vad jag fått lära mig och det har funkat när jag fått samma fel!

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem

Du skapar inte någon anslutning.

Förutom det är det en bra idé att kolla returvärden från de funktioner du anropar för att se så alla operationer lyckas, och vid fel skriva ut ett beskrivande felmeddelande. Vill du ha en utskrift direkt på stderr finns perror, annars finns strerror för att bara få en en sträng.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem

Skapa anslutning, det gör jag med connect() va?

Första argumentet är socketen, d.v.s. "conn" i mitt fall antar jag? Men vad är övriga argument?

morphman: felet löste sig med att göra som badboll föreslog, men vad använder du för att kompilera?

Permalänk
Citat:

Ursprungligen inskrivet av Jonniboi

morphman: felet löste sig med att göra som badboll föreslog, men vad använder du för att kompilera?

Jag använder Bloodshed Dev-C++, den är gratis att hämta från deras hemsida!

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av morphman86
Jag använder Bloodshed Dev-C++, den är gratis att hämta från deras hemsida!

Dev-C++ utvecklas dock inte sedan länge, och rekommenderas därför inte.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Citat:

Ursprungligen inskrivet av lajnold
Dev-C++ utvecklas dock inte sedan länge, och rekommenderas därför inte.

Ja just det ja, dumt av mig >.<
Jag använder den för att den är gratis och jag håller på med saker från 2005 och det hade inte kommit så mycket nytt som BDC inte klarade av mellan 01-05...

DMC kanske är att föredra då!

Visa signatur

Stationär: Processor: Intel i5 3.2GHz, RAM: 4Gb, Grafikkort: ATI Radeon HD 5850, OS: Windows 7 Proffessional x64
Laptop: ASUS K53E, Processor: Intel i5 2450M, RAM: 4Gb, Grafik: Integrerad Intel GMA HD, OS: Win7 Home Premium x64 och Xubuntu 10

Permalänk
Avstängd

Man trycker F5 för att köra programmet och då poppar rutan upp och försvinner omedelbart. Man måste lägga in en paus i programmet, så rutan inte försvinner direkt.

Alternativt så trycker man CTRL + F5 istället. Då stannar rutan kvar tills man trycker bort den.

Permalänk
Medlem

Många problem här...

Först, anledningen till att dina printf() inte skriver ut något är förmodligen att du inte avslutar med newline ("\n").

Sen tror jag inte du vill ha gethostbyaddr(), eftersom den gör reverseuppslagning och försöker ge dig ett domännamn för en adress. Dessutom skickar du in en int som adress, då den egentligen vill ha någon typ av struct sockaddr_*. Kolla på getaddrinfo() istället, eller inet_aton() som kanske är lite lättare för det här problemet. Du ska förmodligen ha en struct sockaddr_in som är adress för IPv4. I den structen måste du sätta in porten i sin_port så den vet var du ska connecta.

Sedan måste du som sagt köra connect() för att ansluta socketen till en adress. Du skickar in pekaren till din struct sockaddr_in, lämpligen. Den funktionen kan misslyckas om inget lyssnar där så kolla om returvärdet är -1, och i så fall perror(), strerror() eller errno.

Din recv() ser väl okej ut, frånsett att buff är en invalid pekare, som måste allokeras först, som andra påpekat. Går att använda read() också som vanligt, men det är sak samma. Tror inte du vill använda printf() där eftersom den är buffrad och som sagt vill ha newlines, testa istället write() till STDOUT (1).

Permalänk
Medlem

Jag förstår mig inte riktigt på structs. Skulle behöva hjälp med att skriva getaddrinfo, struckt sockaddr och connect delen. Jag vet inte skillnaden på vad som är en fungerande kod och vad som är en beskrivning av strukturen i structen när jag söker.

Gjorde newlines efter utskriften både efter och i texten som jag vill skriva ut men det blir fortfarande ingen utskrift när jag kör .exe-filen, bara när jag kör debug.

printf(buff); printf("\n"); printf("test \n");

Permalänk
Medlem

Jag försökte använda denna kod kopierad från Beejs tutorial:

struct sockaddr_in ip4addr; int s; ip4addr.sin_family = AF_INET; ip4addr.sin_port = htons(1470); inet_pton(AF_INET, "10.1.0.1", &ip4addr.sin_addr); s = socket(PF_INET, SOCK_STREAM, 0); bind(s, (struct sockaddr*)&ip4addr, sizeof ip4addr);

Problemet då blir att inet_pton() inte finns, har försökt med getaddrinfo() och inet_aton() som ovan men det funkar inte heller för mig, de finns inte.

....cpp(30) : error C3861: 'inet_pton': identifier not found

Permalänk
Medlem

Det verkar som att funktionen heter InetPton i Windows. Prova det.

http://msdn.microsoft.com/en-us/library/cc805844(VS.85).aspx

Permalänk
Medlem

InetPton funkade inte heller, också identifier not found.

Någon som har lust att skriva en tcp-klient som skriver ut data på skärmen som hämtas från 10.1.0.1:1470, gärna med lite kommentarer så jag kan förstå hur det funkar?