- 締切済み
ソケットAPI について
ソケット通信を勉強するために、PC1台での簡単なクライアント・サーバー型のネットワークシステムを作成したいのですが、 1:クライアントの実行ファイル起動、connect()後にクライアントのIPアドレス、ポート番号を標準出力したいのですが、どうすればよいでしょうか? connect()関数で宛先のIPアドレス、Portは第2引数であたえると思うのですが、 調べたところ、接続元のIPアドレス、Portは自動的にバインドされているとか・・。 では、そのバインドされている物?構造体から引用すればいいのかな・・と素人的な考えでしょうか? 2:socket()作成時のdomain引数には、AF_INETにしなければならないでしょうか? PC1台でサーバ、クライアント実行ファイルの両方を起動させますが、通信では、一度LANポートからローカルエリアへ出て戻ってくるだけなら、AF_LOCALでも良いのでしょうか? AF_INETのdomain引数で、ネット上へ出て戻ってこれるのでしょうか? (ネットに出るなら、セキュリティ的に怖い気もするのですが・・) まだ、C言語を勉強し始めて4ヶ月程度です。 宜しくお願い致します。 PC環境 Windows XP cygwin上にてgccコンパイル、実行ファイル起動
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- nfonfonfo
- ベストアンサー率63% (12/19)
1です連投すみません。間違った解答をしてしまいましたので、 お詫びとしてAF_INETでのサンプルを書いてみました。 #defineで宣言しているIP_ADDRESSとPORT_NUMBERをサーバーのIPとポート番号に変えてから実行してください。 ---ここからサンプルコード------------------------- #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #include <errno.h> #define IP_ADDRESS "192.168.11.2" #define PORT_NUMBER 12345 int main(void) { struct sockaddr_in sin={0}; struct sockaddr_in local={0}; int slen = sizeof(local); int sockfd = socket(AF_INET, SOCK_STREAM, 0); inet_aton(IP_ADDRESS, &sin.sin_addr); sin.sin_port = htons(PORT_NUMBER); sin.sin_family = AF_INET; if(connect(sockfd, (const struct sockaddr*)&sin,sizeof(sin))< 0) { printf("connect error %d\n", errno); } if(getsockname(sockfd, (struct sockaddr*)&local, &slen) < 0) { printf("getsockname error %d\n", errno); } printf("client ip:%s port:%d\n", inet_ntoa(local.sin_addr), ntohs(local.sin_port)); close(sockfd); return 0; } 以上です。
- nfonfonfo
- ベストアンサー率63% (12/19)
1番目は connect関数で戻ってきたソケットに対して getsockname関数とinet_aton関数を使用すれば取得可能です。 表示するときはネットワークバイトオーダーからホストバイトオーダーへの変換を忘れないようにして下さい>ntohs関数