Come posso sapere se una porta TCP è aperta o no? [chiuso]


9

Sto cercando di implementare la programmazione socket in C. Quando provo a connettermi da un client a un server (Ubuntu), mostra un errore come "connessione fallita".

Quindi penso che il problema sia con la porta. Sto usando la porta 5454 / tcp per la programmazione socket.

Come posso sapere se la porta 5454 è in ascolto o no? In caso contrario, quali sono le porte che posso usare per la programmazione socket TCP usando C in Ubuntu? È questo il problema solo con la porta o c'è qualcosa di sbagliato nel mio codice o qualsiasi impostazione è richiesta in LINUX Ubuntu?

EDIT: frammento di codice:

  int socket_send;
   struct sockaddr_in address;
printf("\n Initialization Socket....");

socket_send = socket(AF_INET,SOCK_STREAM,0);
if(socket_send == -1)
{
    perror("\n Socket not created.Error:");
    return 1;
}
printf("\n Socket created");

address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr(ip);
address.sin_port=htons(5454);

if(connect(socket_send,(struct sockaddr*)&address,sizeof(struct sockaddr))<0)
{
    perror("\nConnetion failed.Error:");
    return 1;
}
printf("\n Connected");

if(send(socket_send,(char*)buffer,size,flag)<0)
{
    perror("\nSending failed.Error:");
    return 1;
}
printf("\n Data successfully sent");
 close(socket_send);

EDIT : il problema è in porto, quindi ho appena installato Ubuntu e funziona. Grazie a tutti.


all'inizio, la porta 5454 dovrebbe ascoltare lo stato, quindi connect.second controlla il tuo firewall.
Golfo Persico,

Ci provo sempre lsof -i:5454(potrebbe essere necessario eseguirlo come lo stesso utente del programma che apre la porta o come root).
Carlos Campderrós,

dov'è il codice del server (o il server è un programma esistente) Nota che se vuoi eseguire un server fittizio, nc (netcat) è tuo amico.
Foon,

Risposte:


10

Dato che stai programmando in CI pensando di pubblicare un piccolo frammento che ti mostri se la porta è aperta o meno, ho programmato di emettere una stringa. Puoi facilmente cambiarlo per adattarlo alle tue necessità.

Rispondi alla tua seconda domanda, come hanno detto tutti qui, puoi praticamente usare qualsiasi porta se sei il superutente (root) sul sistema se la porta non è usata da nessun'altra applicazione. Se non sei il root, puoi aprire qualsiasi porta sopra 1024.

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


int main(int argc, char *argv[])
{
    int portno     = 5454;
    char *hostname = "192.168.56.101";

    int sockfd;
    struct sockaddr_in serv_addr;
    struct hostent *server;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        error("ERROR opening socket");
    }

    server = gethostbyname(hostname);

    if (server == NULL) {
        fprintf(stderr,"ERROR, no such host\n");
        exit(0);
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
         (char *)&serv_addr.sin_addr.s_addr,
         server->h_length);

    serv_addr.sin_port = htons(portno);
    if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) {
        printf("Port is closed");
    } else {
        printf("Port is active");
    }

    close(sockfd);
    return 0;
}

Eccellente! modo per controllare lo stato di una porta usando C.
Valentin Bajrami il

Adoro la menzione "un piccolo frammento" ^^. Ma +1 per uno snippet molto informativo.
Olivier Dulac,

Nota, nel caso in cui questo codice venga eseguito contemporaneamente ad altri thread che possono fork () nuovi processi, è necessario assicurarsi che il descrittore del file socket sia chiuso correttamente specificando SOCK_CLOEXECla socket()chiamata.
Ton van den Heuvel,

5

Esistono diversi modi, probabilmente il più comune è:

# netstat -ltun

Puoi, ovviamente, grepper altre espressioni (regolari).

Se si utilizzano macchine diverse (client e server), è necessario controllare iptablesanche.

Puoi praticamente usare qualsiasi porta che non è attualmente utilizzata per i tuoi programmi. Verificare, tuttavia, /etc/servicesper porte note e riservate.


Puoi elencare direttamente le porte tcp / udp nello stato di ascolto con "netstat -ltun"
dsmsk80,

quando ho usato netstat -an | grep ASCOLTA Lì mostra solo due protc tcp e il resto delle porte UDP. Ora, se voglio attivare la porta 5454, allora come attivare?
dxr,

@ dsmsk80 ah, anzi, immagino che le cattive abitudini siano dure a morire. Corretto.
Dawud,

1

Verificare che il collegamento ( http://wi-fizzle.com/article/458 ) per la porta TCP sia aperto o meno

nc -z <host_or_ip> <port> 1>/dev/null 2>&1; result=$?;

if [ $result -eq 0 ]; then
    echo 'the port is open for tcp connections'
else
    echo 'the port was closed'
fi

1

Usa il comando:

nmap 192.168.56.101

Ne risulterà il numero di porte aperte su quella macchina insieme al nome dei servizi


Usare tutto tranne che nmapper questo è battere intorno al cespuglio IMHO. Per controllare una singola porta è necessario utilizzare nmap -p5454 192.168.56.101.
jwg

Questo risponde solo al titolo ma non risponde alla domanda reale.
JZeolla,

Sì. Stavo solo mostrando la direzione. Deve camminare per ottenere la risposta desiderata. :)
SHW,

1

Lo strumento migliore per provare a determinare se un processo è associato a una porta TCP è netstat. Puoi eseguirlo in questo modo per ottenere un elenco del nome del processo associato, se presente, nonché delle connessioni alla porta, nonché il loro stato.

Esempio

$ netstat -tapn | head -15
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:49006               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   
tcp        0      0 0.0.0.0:17500               0.0.0.0:*                   LISTEN      3516/dropbox        
tcp        0      0 0.0.0.0:17501               0.0.0.0:*                   LISTEN      3517/dropbox        
tcp        0      0 0.0.0.0:2143                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 127.0.0.1:1986              0.0.0.0:*                   LISTEN      2757/mono           
tcp        0      0 0.0.0.0:2025                0.0.0.0:*                   LISTEN      4383/ssh            
tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 
tcp        0      0 192.168.1.20:58286          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:54000          174.37.23.130:6667          ESTABLISHED 2696/pidgin         

Quanto sopra mostra le porte aperte localmente nella terza colonna e le porte remote a cui siamo disposti ad accettare connessioni, ad esempio con queste 2 linee:

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      -                   
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      -                   

Queste 2 linee mostrano che stiamo ascoltando sulla porta 22, (sshd) e siamo disposti ad accettare connessioni da qualsiasi interfaccia che abbiamo (ad es. Qualsiasi scheda di rete, Ethernet o wireless). Al momento non ci sono connessioni a questa porta.

La seconda riga mostra che stiamo eseguendo il server CUPS (per la stampa) sulla porta 631 e possiamo collegarci ad esso solo tramite l'interfaccia localhost (127.0.0.1).

Più in basso abbiamo queste 2 linee:

tcp        0      0 192.168.1.20:58285          198.252.206.25:80           TIME_WAIT   -                   
tcp        0      0 192.168.1.20:58188          198.252.206.25:80           ESTABLISHED 3830/chrome --purge 

Il che dimostra che stiamo accedendo a un sito Web all'indirizzo IP 198.252.206.25. Sappiamo che è un sito Web perché accediamo a questo server tramite la porta 80 (HTTP). Inoltre, se cerchiamo l'indirizzo IP, troviamo questo:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.