Naslouchání na portu - c - Linux – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Naslouchání na portu - c - Linux – C / C++ – Fórum – Programujte.comNaslouchání na portu - c - Linux – C / C++ – Fórum – Programujte.com

 

dragon124-10
Stálý člen
26. 10. 2012   #1
-
0
-

Dobrý den,

Potřeboval bych udělat aplikaci, která bude naslouchat na portu a bude moct i odpovídat. Zkrátka jako bych se přes PuTTY připojil na nějakém portu, který bych v té aplikaci definoval. Ta aplikace by poté se mnou přes tento port mohla komunikovat. Například bych udělal, že po připojení na tomto portu by se to zeptalo na heslo, já bych ho zadal, zeptalo by se mi to třeba na něco, já bych zase odpověděl atd...

Bohužel s Googlením jsem neuspěl. Úplně by mi stačilo nasměrovat na nějakou knihovnu.

P.S.: Nebylo by chytré nějak využít NetCatu abych to nemusel všechno programovat?

Nahlásit jako SPAM
IP: 89.235.32.–
liborb
~ Redaktor
+18
Guru
26. 10. 2012   #2
-
0
-
Nahlásit jako SPAM
IP: 188.75.135.–
dragon124-10
Stálý člen
26. 10. 2012   #3
-
0
-

Děkuji moc, ty články jsou hezky napsaný. Bohužel já jsem to asi špatně napsal, myslel jsem jako když se normálně připojim přes telnet, tak aby to se mnou komunikovalo. Jestli jsem to správně pochopil, tak to co tam píšou, to je pouze aplikace server a client. Tudíž vlastně třeba k tomu aby moje aplikace běžela v "cloudu". Pude se k tomu serveru připojit přes telnet?

Nahlásit jako SPAM
IP: 89.235.32.–
nergal+1
Návštěvník
26. 10. 2012   #4
-
0
-

ano pojde nie netreba aby tvoja aplikacia bezala v cloudu teda ak nepovazujes svoj pocitac za cloud ;)

jak LEN aplikacia klient a server? vsak server pocuva na porte a klient sa pripaja co viac chces?

Nahlásit jako SPAM
IP: 85.135.154.–
viem že neviem čo viem
liborb
~ Redaktor
+18
Guru
26. 10. 2012   #5
-
0
-

Telnet je klient, který se připojuje k počítači (serveru) na daném portu, komunikují daným protokolem atd.

Pokud chceš, aby ses připojil k počítači a ten ti na tvoje dotazy nějakých způsobem odpovídal, tak musíš napsat klienta, který bude ty dotazy počítači posílat (nebo použít nějaké existující klienta, pokud ti všechno z něj bude vyhovovat) a pak musíš napsat server, ke kterému se připojíš a do něj zadrátuješ logiku toho, jak má na tvoje dotazy odpovídat.

Nahlásit jako SPAM
IP: 188.75.135.–
dragon124-10
Stálý člen
26. 10. 2012   #6
-
0
-

Děkuji moc, klient je telnet, napíšu jen server. K tomu bych se chtěl jen zeptat, požadavky se přenáší jako plain text? (nechci nic šifrovat)

nergal:

Cloudem jsem myslel server a dal jsem to do uvozovek proto že tyto buzzwordy nemam rád - dneska už řeknou markeťáci že je to v cloudu všemu, co je na internetu.

--edit--

Bohužel nejde mi to zkompilovat, hlásí mi to toto:

jakub@jakub-G33-DS3R:~/Programování/telnetServer$ g++ server.cpp
server.cpp: In function ‘int main(int, char**)’:
server.cpp:32:23: error: ‘atoi’ was not declared in this scope
Nahlásit jako SPAM
IP: 89.235.32.–
KIIV
~ Moderátor
+43
God of flame
26. 10. 2012   #7
-
0
-

#6 dragon124
budes muset najit, kde je atoi deklarovano (v jakem hlavickovem souboru)

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dragon124-10
Stálý člen
26. 10. 2012   #8
-
0
-

hm.. :/ mě taky mohlo napadnout. Bohužel output je

Syntaxe:
	./a.out port

a když se připojím přes PuTTY na localhost na daném portu, tak to napíše PuTTY fatal error.

Zdroják mam:

#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string>
#include <stdio.h>
#include <stdlib.h>



#define BUFSIZE 1000

using namespace std;

int main(int argc, char *argv[])
{
   std::string text;             // Přijímaný text
   sockaddr_in sockName;         // "Jméno" portu
   sockaddr_in clientInfo;       // Klient, který se připojil 
   int mainSocket;               // Soket
   int port=6543;                     // Číslo portu
   char buf[BUFSIZE];            // Přijímací buffer
   int size;                     // Počet přijatých a odeslaných bytů
   socklen_t addrlen;            // Velikost adresy vzdáleného počítače
   int count = 0;                // Počet připojení

   if (argc != 2)
   {
     cerr << "Syntaxe:\n\t" << argv[0]
	  << " " << "port" << endl;
     return -1;
   }
   port = atoi(argv[1]);
   // Vytvoříme soket - viz minulý díl
   if ((mainSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1)
   {
     cerr << "Nelze vytvořit soket" << endl;
     return -1;
   }
   // Zaplníme strukturu sockaddr_in
   // 1) Rodina protokolů
   sockName.sin_family = AF_INET;
   // 2) Číslo portu, na kterém čekáme
   sockName.sin_port = htons(port);
   // 3) Nastavení IP adresy lokální síťové karty, přes kterou je možno se
   //    připojit. Nastavíme možnost připojit se odkudkoliv. 
   sockName.sin_addr.s_addr = INADDR_ANY;
   // přiřadíme soketu jméno
   if (bind(mainSocket, (sockaddr *)&sockName, sizeof(sockName)) == -1)
   {
     cerr << "Problém s pojmenováním soketu." << endl;
     return -1;
   }
   // Vytvoříme frontu požadavků na spojení. 
   // Vytvoříme frontu maximální velikosti 10 požadavků.
   if (listen(mainSocket, 10) == -1)
   {
     cerr << "Problém s vytvořením fronty" << endl;
     return -1;
   }
   do
   {
     // Poznačím si velikost struktury clientInfo.
     // Předám to funkci accept. 
     addrlen = sizeof(clientInfo);
     // Vyberu z fronty požadavek na spojení.
     // "client" je nový soket spojující klienta se serverem.
     int client = accept(mainSocket, (sockaddr*)&clientInfo, &addrlen);
     int totalSize = 0;
     if (client == -1)
     {
       cerr << "Problém s přijetím spojeni" <<endl;
       return -1;
     }
     // Zjistím IP klienta.
     cout << "Někdo se připojil z adresy: " 
	  << inet_ntoa((in_addr)clientInfo.sin_addr) << endl;
     // Přijmu data. Ke komunikaci s klientem používám soket "client"
     text = "";
     // Přijmeme maximálně 6 bytový pozdrav. 
     while (totalSize != 6)
     {
       if ((size = recv(client, buf, BUFSIZE - 1, 0)) == -1)
       {
	 cerr << "Problém s přijetím dat." << endl;
	 return -1;
       }
       cout << "Přijato: " << size << endl;
       totalSize += size;
       text += buf;
     }
     cout << text;
     // Odešlu pozdrav
     if ((size = send(client, "Nazdar\n", 8, 0)) == -1)
     {
       cerr << "Problém s odesláním dat" << endl;
       return -1;
     }
     cout << "Odesláno: " << size << endl;
     // Uzavřu spojení s klientem
     close(client);
   }
   while (++count != 3);
   cout << "Končím" << endl;
   close(mainSocket);
   return 0;
}
Nahlásit jako SPAM
IP: 89.235.32.–
dragon124-10
Stálý člen
26. 10. 2012   #9
-
0
-

Už se mi to zapomocí Googlu podařilo. Děkuji moc všem. Mohl bych se ještě zeptat, místo printf se využívá funkce cerr, jakou funkci použít místo scanf? Nepodařilo se mi to vygooglit.

Nahlásit jako SPAM
IP: 89.235.32.–
KIIV
~ Moderátor
+43
God of flame
26. 10. 2012   #10
-
0
-

cin >> promenna;     (z hlavicky iostream)

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dragon124-10
Stálý člen
26. 10. 2012   #11
-
0
-

Bohuzel, nyni jsem se vsiml, ze presto, ze mam knihovnu iostream includnutou, tak mi to pise:

server.cpp: In function ‘int main(int, char**)’:
server.cpp:141:9: error: ‘cout’ was not declared in this scope
server.cpp:141:9: note: suggested alternative:
In file included from hack2.cpp:17:0:
/usr/include/c++/4.7/iostream:62:18: note:   ‘std::cout’
server.cpp:141:52: error: expected ‘;’ before ‘)’ token
server.cpp:142:9: error: ‘cin’ was not declared in this scope
server.cpp:142:9: note: suggested alternative:
In file included from hack2.cpp:17:0:
/usr/include/c++/4.7/iostream:61:18: note:   ‘std::cin’

pritom je zdrojak

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <fcntl.h>

#include <sys/types.h> 

#include <sys/socket.h>

#include <netinet/in.h>

#include <iostream>



 

void nonblock(int sockfd)

{

    int opts;

    opts = fcntl(sockfd, F_GETFL);

    if(opts < 0)

    {

        fprintf(stderr, "fcntl(F_GETFL) failed\n");

    }

    opts = (opts | O_NONBLOCK);

    if(fcntl(sockfd, F_SETFL, opts) < 0) 

    {

        fprintf(stderr, "fcntl(F_SETFL) failed\n");

    }

}

 

int main(int argc, char *argv[])

{

     int BUFLEN = 2000;

     int sockfd, newsockfd, portno;

     socklen_t clilen;

     char buffer[BUFLEN];

     struct sockaddr_in serv_addr, cli_addr;

     int n, i;

     int one = 1;


 

     if (argc < 2) {

         fprintf(stderr,"please specify a port number\n");

         //exit(1);

     }

     sockfd = socket(AF_INET, SOCK_STREAM, 0);

     if (sockfd < 0) {

        perror("ERROR create socket");

        exit(1);

     }

     setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &one, sizeof one);    //allow reuse of port

     //bind to a local address

     bzero((char *) &serv_addr, sizeof(serv_addr));

     portno = 35;  //atoi(argv[1]);

     serv_addr.sin_family = AF_INET;

     serv_addr.sin_addr.s_addr = INADDR_ANY;

     serv_addr.sin_port = htons(portno);

     if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {

        perror("ERROR on bind");

        exit(1);

     }

     //listen marks the socket as passive socket listening to incoming connections, 

     //it allows max 5 backlog connections: backlog connections are pending in queue

     //if pending connections are more than 5, later request may be ignored

     listen(sockfd,5);

     //accept incoming connections

     clilen = sizeof(cli_addr);

     newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);

     //nonblock(newsockfd);        //if we want to set the socket as nonblock, we can uncomment this

     if (newsockfd < 0) {

        perror("ERROR on accept");

        exit(1);

     }

     printf("connection accepted\n");
     

        cout << "Problém s pojmenováním soketu.");
        cin >> NULL;
	
         sleep(2);

     close(newsockfd);

     close(sockfd);

     return 0; 

}
Nahlásit jako SPAM
IP: 89.235.32.–
KIIV
~ Moderátor
+43
God of flame
26. 10. 2012   #12
-
0
-

no ja nevim jak to jeste napsat jinak... GOOGLEEEE

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dragon124-10
Stálý člen
26. 10. 2012   #13
-
0
-

To mi u6 funguje, ale je probl0m, 6e se to vypisuje na konzoli na stran2 serveru a nepos9la se to clientovi...

Nahlásit jako SPAM
IP: 89.235.32.–
KIIV
~ Moderátor
+43
God of flame
26. 10. 2012   #14
-
0
-

se divim.. nevidim tu nic jako nacitani ze socketu natoz abys taky odpovedel..

co ma za ukol napriklad  cin >> NULL; ?

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dragon124-10
Stálý člen
26. 10. 2012   #15
-
0
-

to melo pozkat dikud uzivatel neco nenapise, ale ted uz tam mam normalne promenou a pokou3im se do ni davat obsah, ale potrebuju aby tam ten obsah posilal ten nekdo ce je pripojenej pres putty a aby se to vypisovalo taky jemu.

Nahlásit jako SPAM
IP: 89.235.32.–
KIIV
~ Moderátor
+43
God of flame
26. 10. 2012   #16
-
0
-

stale musis z toho socketu co ti vyhodil accept neco taky nacist a poslat zpet.. to se samo neudela

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
dragon124-10
Stálý člen
31. 10. 2012   #17
-
0
-

A to udělam jak?

Nahlásit jako SPAM
IP: 89.235.32.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 82 hostů

Podobná vlákna

Příjem z COM portu — založil radar.sm

Seznam portů — založil Martin Beseda

Zařízení na COM PORTU — založil scorpions-cz

LBA přímo z IO portů? — založil Matěj Andrle

Ovládání USB portu — založil Budry

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý