とても簡単な質問があります。特定のポートが現在使用されているかどうかをテストしたい。このために、TCPソケットをポートにバインドしたいと思います。接続が拒否された場合はポートが使用中であることを意味し、そうでない場合はポートが空いていることを意味します。
CでTCPソケットコードを書く方法を教えてください。私はsolarisプラットフォームを使用しています。
私はその非常に基本的なことを知っています。しかし、私はあなたの助けに感謝します. 前もって感謝します。
エラーが発生した場合、bind関数の呼び出しは-1を返します。これには、アドレスがすでに使用されている場合も含まれます。
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define PORT 12345
int main()
{
struct sockaddr_in addr;
int fd;
fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd == -1)
{
printf("Error opening socket\n");
return -1;
}
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = 0;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_family = AF_INET;
if(bind(fd, (struct sockaddr *)&addr,sizeof(struct sockaddr_in) ) == -1)
{
printf("Error binding socket\n");
return -1;
}
printf("Successfully bound to port %u\n", PORT);
}
それは、テストしようとしているものにわずかに依存します。
bind()
joelc が提案した方法で使用すると、マシンのインターフェイスでポートが開いているかどうかがわかります。念のために言っておきますが、 からの戻り値だけでなく、bind()
もチェックする必要がありますerrno == EADDRINUSE
。
すなわち。(joelc のコードの修正)
if(bind(socket, (struct sockaddr *)&sin,sizeof(struct sockaddr_in) ) == -1)
{
if( errno == EADDRINUSE )
{
// handle port already open case
}
else
{
// handle other errors
}
}
行で使用されているアドレスを変更することにより: 例:
sin.sin_addr.s_addr = inet_addr("192.168.1.1");
...特定のインターフェイスでポートが使用可能かどうかをテストできます。
ただし、これはポート状態の完全なテストではないことに注意してください。close()
別のプロセスがポートを開いていて、ポートを正常に閉じる前に (つまり、ソケットで呼び出す前に) 終了した場合、通常は同じEADDRINUSE
エラーが発生します。(ソケットに SO_REUSEADDR オプションが設定されているかどうかによって異なります)
(補足: テスト アプリケーションが十分な権限で実行されていない限り、1024 未満のポートに bind() を実行することはできません)
匿名が示唆したように、あなたも見ることができますnetstat
. これにより、繰り返し呼び出すことで取得できるのと同じ情報がすべて得られます。これにより、bind()
はるかに迅速に副作用が発生することはありません (ポートに実際にバインドする必要がないため、他のプロセスで使用できなくなるなど)。 . 出力を呼び出しnetstat -a --numeric-ports -t
て分析するだけで、目的のすべてが得られます。
ただし、moogs の提案に関するコメント - 各ポートで telnet を呼び出すと、ソケットがそのポートでリッスンしているかどうかだけがわかります - 実際に開いているかどうかではありません。
特定のポートが現在使用されているかどうかをテストしますか?(そして実際にプログラムを作成する必要はありません)。その場合は、telnetを使用できます。
telnetホストポート
接続に失敗した場合、それは使用されていません。接続してユーザーからの入力を待つ場合は、使用中です:)
netstat のソース コードを参照してください。Solarisにもnetstatがあると思います。