質問: ソケット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コンパイル、実行ファイル起動
回答: 1です連投すみません。間違った解答をしてしまいましたので、 お詫びとしてaf_inetでのサンプルを書いてみました。 #defineで宣言しているip_addressとport_numberをサーバーのipとポート番号に変えてから実行してください。 ---ここからサンプルコード------------------------- #include #include #include #include #include #include #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; } 以上です。