TCP 포트가 열려 있는지 여부를 어떻게 알 수 있나요?

TCP 포트가 열려 있는지 여부를 어떻게 알 수 있나요?

C로 소켓 프로그래밍을 구현하려고 합니다. 클라이언트에서 서버(Ubuntu)로 연결하려고 하면 "연결 실패"와 같은 오류가 표시됩니다.

그래서 문제는 포트에 있다고 생각합니다. 소켓 프로그래밍을 위해 5454/tcp 포트를 사용하고 있습니다.

5454 포트가 수신 대기 중인지 여부를 어떻게 알 수 있나요? 그렇지 않다면 Ubuntu에서 C를 사용하여 TCP 소켓 프로그래밍에 사용할 수 있는 포트는 무엇입니까? 포트에만 문제가 있습니까? 아니면 내 코드에 문제가 있거나 LINUX Ubuntu에 설정이 필요합니까?

편집하다: 코드 조각:

  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);

편집하다: 포트에 문제가 있어서 방금 Ubuntu를 다시 설치했는데 작동합니다. 여러분 감사합니다.

답변1

CI에서 프로그래밍 중이므로 포트가 열려 있는지 여부를 보여주는 작은 조각을 게시할 생각이므로 문자열을 출력하도록 프로그래밍했습니다. 필요에 맞게 쉽게 변경할 수 있습니다.

두 번째 질문에 답하십시오. 여기 있는 모든 사람이 말했듯이, 다른 응용 프로그램에서 해당 포트를 사용하지 않는 경우 시스템의 슈퍼 사용자(루트)인 경우 모든 포트를 거의 사용할 수 있습니다. 루트가 아닌 경우 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;
}

답변2

여러 가지 방법이 있는데, 가장 일반적인 방법은 다음과 같습니다.

# netstat -ltun

물론 grep다른 (정규) 표현식에도 사용할 수 있습니다.

다른 컴퓨터(클라이언트와 서버)를 사용하는 경우 iptables에도 확인해야 합니다.

현재 프로그램에 사용되지 않는 포트를 거의 사용할 수 있습니다. 그러나 /etc/services알려진 포트와 예약된 포트가 있는지 확인하십시오.

답변3

링크를 확인하세요(http://wi-fizzle.com/article/458) TCP 포트가 열려 있는지 여부

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

답변4

프로세스가 TCP 포트에 바인딩되어 있는지 확인하는 가장 좋은 도구는 입니다 netstat. 이렇게 실행하면 바인딩된 프로세스 이름 목록과 포트에 대한 연결 및 해당 상태 목록을 얻을 수 있습니다.

$ 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         

위의 세 번째 열에는 로컬로 열린 포트와 다음 두 줄과 같이 연결을 허용할 원격 포트가 나와 있습니다.

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      -                   

이 두 줄은 우리가 포트 22(sshd)에서 수신 대기 중이며 우리가 가지고 있는 모든 인터페이스(예: 네트워크 카드, 이더넷 또는 무선)로부터의 연결을 기꺼이 수락한다는 것을 보여줍니다. 현재 이 포트에 대한 연결이 없습니다.

두 번째 줄은 포트 631에서 CUPS 서버(인쇄용)를 실행하고 있으며 localhost(127.0.0.1) 인터페이스를 통해서만 연결할 수 있음을 보여줍니다.

더 아래로 내려가면 다음 두 줄이 있습니다.

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 

이는 우리가 IP 주소 198.252.206.25의 웹사이트에 액세스하고 있음을 보여줍니다. 우리는 포트 80(HTTP)을 통해 이 서버에 액세스하고 있기 때문에 그것이 웹사이트라는 것을 알고 있습니다. 또한 IP 주소를 조회하면 다음과 같은 내용을 찾을 수 있습니다.

$ dig -x 198.252.206.25 +short
stackoverflow.com.

관련 정보