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);
[〜#〜] edit [〜#〜]:ポートに問題があるため、Ubuntuを再インストールしただけで機能します。皆様ありがとうございました。
あなたはCでプログラミングしているので、ポートが開いているかどうかを示す小さなスニペットを投稿することを考えたので、文字列を出力するようにプログラムしました。ニーズに合わせて簡単に変更できます。
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;
}
いくつかの方法がありますが、最も一般的な方法は次のとおりです。
# netstat -ltun
もちろん、他の(正規の)式に対してgrep
を使用できます。
異なるマシン(クライアントとサーバー)を使用している場合は、iptables
もチェックする必要があります。
現在プログラムで使用されていないポートであれば、ほとんどの場合使用できます。ただし、/etc/services
は既知のポートおよび予約済みポートです。
リンク( 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
次のコマンドを使用します。
nmap 192.168.56.101
そのマシンで開いているポートの数とサービスの名前が表示されます
プロセスが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.