TCP 포트가 열려 있는지 어떻게 알 수 있습니까? [닫은]


9

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

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

5454 포트가 수신 중인지 어떻게 알 수 있습니까? 그렇지 않다면 우분투에서 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);

편집 : 문제가 포트에 있으므로 방금 우분투를 다시 설치했는데 작동합니다. 모두 감사합니다.


처음에는 포트 5454가 상태를 수신 대기해야합니다. 그런 다음 연결합니다. 두 번째로 방화벽을 확인하십시오.
페르시아 걸프

항상 시도합니다 lsof -i:5454(포트를 여는 프로그램과 동일한 사용자 또는 루트로 실행해야 할 수도 있음).
Carlos Campderrós

서버 코드는 어디에 있습니까 (또는 서버는 기존 프로그램입니다) 더미 서버를 실행하려면 nc (netcat)가 친구입니다.
Foon

답변:


10

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

우수한! C를 사용하여 포트의 상태를 확인하는 방법
Valentin Bajrami

나는 "작은 발췌 문장"^^을 좋아합니다. 그러나 유익한 스 니펫은 +1입니다.
Olivier Dulac

참고 경우이 코드는 가능한 포크 () 새로운 프로세스가이 소켓의 파일 기술자를 지정하여 제대로 닫혀 있는지 확인하기 위해 필요하다는 것을 다른 스레드를 동시에 실행 SOCK_CLOEXEC에 대한 socket()호출.
Ton van den Heuvel

5

몇 가지 방법이 있으며 가장 일반적인 방법은 다음과 같습니다.

# netstat -ltun

물론 grep다른 (정규) 표현을 할 수도 있습니다.

다른 시스템 (클라이언트 및 서버)을 사용하는 경우 iptables에도 확인해야합니다 .

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


"netstat -ltun"을 사용하여 청취 상태의 tcp / udp 포트를 직접 나열 할 수 있습니다.
dsmsk80

netstat -an | grep LISTEN 여기에는 두 개의 tcp prot 만 표시되며 나머지는 UDP 포트입니다. 이제 5454 포트를 활성화하려면 어떻게 활성화합니까?
dxr

@ dsmsk80 아, 실제로, 나쁜 습관은 열심히 죽는 것 같아요. 수정되었습니다.
dawud

1

TCP 포트에 대한 링크 ( http://wi-fizzle.com/article/458 )가 열려 있는지 확인하십시오

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

다음 명령을 사용하십시오.

nmap 192.168.56.101

서비스 이름과 함께 해당 시스템에서 열린 포트 수


nmap이것 이외의 것을 사용 하면 부시 IMHO 주위를 때리고 있습니다. 단일 포트를 확인하려면을 사용해야합니다 nmap -p5454 192.168.56.101.
jwg

이것은 제목에만 대답하지만 실제 질문에는 대답하지 않습니다.
JZeolla

예. 나는 단지 방향을 보여주고 있었다. 그는 원하는 답을 얻기 위해 걸어야합니다. :)
SHW

1

프로세스가 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 서버 (인쇄용)를 실행 중이며 로컬 호스트 (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.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.