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

편집하다:포트에 문제가 있어서 방금 우분투를 다시 설치했더니 작동이 되더라구요. 다들 감사 해요.

답변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.

관련 정보