Como posso saber se uma porta TCP está aberta ou não? [fechadas]

9

Estou tentando implementar a programação de soquetes no C. Quando tento conectar-me de um cliente a um servidor (Ubuntu), ele mostra um erro como "falha na conexão".

Então eu acho que o problema está com a porta. Estou usando a porta 5454 / tcp para programação de soquete.

Como posso saber se a porta 5454 está escutando ou não? Caso contrário, quais são as portas que eu posso usar para programação de soquete TCP usando C no Ubuntu? Esse é o problema apenas da porta ou há algo errado no meu código ou qualquer configuração é necessária no Linux Linux?

EDIT: Fragmento de código:

  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 : O problema está na porta, então eu apenas reinstalei o Ubuntu e está funcionando. Obrigado, todos vocês.

dxr
fonte
no início, a porta 5454 deve escutar o estado. Em seguida, você se conecta. em seguida, verifique seu firewall.
precisa saber é o seguinte
Eu sempre tento lsof -i:5454(talvez seja necessário executá-lo como o mesmo usuário que o programa que abre a porta ou como root).
Carlos Campderrós
onde está o código do servidor (ou o servidor é um programa existente) Observe que se você deseja executar um servidor fictício, o nc (netcat) é seu amigo.
Foon

Respostas:

10

Como você está programando no CI, pensou em postar um pequeno trecho que mostra se a porta está aberta ou não, eu programei para gerar uma string. Você pode alterá-lo facilmente para atender às suas necessidades.

Responda à sua segunda pergunta, como todos disseram aqui, você pode usar praticamente qualquer porta se for o superusuário (root) no sistema se a porta não for usada por nenhum outro aplicativo. Se você não for o root, poderá abrir qualquer porta acima de 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;
}
Purinda Gunasekara
fonte
Excelente! forma a verificar o estado de um portas utilizando C
Valentin Bajrami
Eu amo a menção "um pequeno trecho" ^^. Mas +1 para um snippet muito informativo.
Olivier Dulac
Observe que, se esse código for executado simultaneamente com outros encadeamentos que possibilitam novos processos fork (), é necessário garantir que o descritor de arquivo do soquete seja fechado corretamente especificando SOCK_CLOEXECa socket()chamada.
Ton van den Heuvel
5

Existem várias maneiras, sendo as mais comuns:

# netstat -ltun

Você pode, é claro, grepobter outra expressão (regular).

Se você estiver usando máquinas diferentes (cliente e servidor), precisará verificar iptablestambém.

Você pode usar praticamente qualquer porta que não esteja sendo usada atualmente para seus programas. Verifique, no entanto, as /etc/servicesportas conhecidas e reservadas.

dawud
fonte
Você pode listar diretamente as portas tcp / udp no estado de escuta com "netstat -ltun"
dsmsk80
quando usei netstat -an | grep LISTEN Lá mostra apenas dois protc TCP e o restante são portas UDP. Agora, se eu quiser ativar a porta 5454, como ativar?
Dxr 27/09/13
@ dsmsk80 ah, de fato, acho que maus hábitos morrem com dificuldade. Corrigido.
dawud 27/09/13
1

Verifique o link ( http://wi-fizzle.com/article/458 ) para ver se a porta TCP está aberta ou não.

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
Saravanan
fonte
1

Use o comando:

nmap 192.168.56.101

Isso resultará no número de portas abertas nessa máquina, juntamente com o nome dos serviços

SHW
fonte
Usando qualquer coisa, mas nmappara isso está batendo em torno do arbusto IMHO. Para verificar uma única porta, você deve usar nmap -p5454 192.168.56.101.
jwg 27/09/2013
Isso apenas responde ao título, mas não responde à pergunta real.
JZeolla #
Sim. Eu estava apenas mostrando a direção. Ele tem que andar para obter a resposta desejada. :)
SHW
1

A melhor ferramenta para tentar determinar se um processo está associado a uma porta TCP é netstat. Você pode executá-lo assim para obter uma lista do nome do processo que está vinculado, se houver, bem como das conexões com a porta, bem como seu estado.

Exemplo

$ 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         

A tabela acima mostra as portas abertas localmente na terceira coluna e as portas remotas às quais estamos dispostos a aceitar conexões, como com estas duas linhas:

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      -                   

Essas duas linhas mostram que estamos ouvindo na porta 22 (sshd) e estamos dispostos a aceitar conexões de qualquer interface que tenhamos (ou seja, qualquer placa de rede, Ethernet ou sem fio). Atualmente não há conexões com esta porta.

A segunda linha mostra que estávamos executando o servidor CUPS (para impressão) na porta 631, e só podemos conectar a ele através da interface localhost (127.0.0.1).

Mais abaixo, temos estas 2 linhas:

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 

Que mostram que estamos acessando um site no endereço IP 198.252.206.25. Sabemos que é um site, porque estamos acessando este servidor pela porta 80 (HTTP). Além disso, se procurarmos o endereço IP, encontramos o seguinte:

$ dig -x 198.252.206.25 +short
stackoverflow.com.
slm
fonte