TCPポートが開いているかどうかを確認するにはどうすればよいですか?[閉まっている]


9

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を再インストールしました、そしてそれは働いています。皆様ありがとうございました。


最初に、ポート5454は状態をリッスンする必要があります。次に接続します。2番目にファイアウォールを確認します。
PersianGulf 2013

私はいつも試しlsof -i:5454ます(ポートを開くプログラムが実行するのと同じユーザー、またはrootとして実行する必要があるかもしれません)。
CarlosCampderrós2013

サーバーコードはどこですか(またはサーバーは既存のプログラムです)ダミーサーバーを実行したい場合は、nc(netcat)がお勧めです。
2013

回答:


10

あなたはCIでプログラミングしているので、ポートが開いているかどうかを示す小さなスニペットを投稿することを考えているので、文字列を出力するようにプログラムしました。ニーズに合わせて簡単に変更できます。

2番目の質問への回答、ここで誰もが言ったように、ポートが他のアプリケーションで使用されていない場合、システムのスーパーユーザー(root)であれば、ほとんどのポートを使用できます。ルートでない場合は、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 2013

このコードがfork()の新しいプロセスである可能性のある他のスレッドと同時に実行される場合SOCK_CLOEXECは、socket()呼び出しを指定してソケットファイル記述子が適切に閉じられていることを確認する必要があります。
Ton van den Heuvel 2017

5

いくつかの方法がありますが、最も一般的な方法は次のとおりです。

# netstat -ltun

もちろん、grep他の(通常の)表現も可能です。

異なるマシン(クライアントとサーバー)を使用しiptablesている場合は、同様に確認する必要があります。

現在プログラムで使用されていないポートであれば、ほとんどが使用できます。ただし、/etc/services既知のポートと予約済みのポートを確認してください。


「netstat -ltun」を使用して、リッスン状態のtcp / udpポートを直接一覧表示できます
dsmsk80

netstat -an |を使用した場合 grep LISTEN 2つのtcp protsのみが表示され、残りはUDPポートです。5454ポートをアクティブにしたい場合、どのようにアクティブにしますか?
dxr 2013

@ dsmsk80ああ、確かに、私は悪い習慣は一生死ぬと思います。修正。
dawud 2013

1

リンク(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

1

次のコマンドを使用します。

nmap 192.168.56.101

そのマシンで開いているポートの数とサービスの名前が表示されます


これ以外の何かを使用することnmapは、ブッシュの私見を打ち負かしています。単一のポートをチェックするには、を使用する必要がありますnmap -p5454 192.168.56.101
jwg 2013

これはタイトルに答えるだけで、実際の質問には答えません。
JZeolla 2013

はい。ただ方向を示していました。彼は望ましい答えを得るために歩く必要があります。:)
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         

上記の3番目の列には、ローカルで開いているポートと、次の2行などで接続を受け入れようとしているリモートポートが表示されています。

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      -                   

これらの2行は、ポート22(sshd)でリッスンしており、所有しているすべてのインターフェイス(ネットワークカード、イーサネット、ワイヤレスなど)からの接続を受け入れる用意があることを示しています。現在、このポートへの接続はありません。

2行目は、werがポート631でCUPSサーバー(印刷用)を実行しており、localhost(127.0.0.1)インターフェースを介してのみ接続できることを示しています。

さらに下には、次の2行があります。

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のWebサイトにアクセスしていることを示しています。ポート80(HTTP)を介してこのサーバーにアクセスしているため、これはWebサイトであることがわかります。また、IPアドレスを調べると、次のことがわかります。

$ dig -x 198.252.206.25 +short
stackoverflow.com.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.