weemiee
@weemiee (weemiee)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【C言語】ソケット通信について - 2

Q&A

ソケット通信について説明された次のサイトにおける、下部あたりに記載されたプログラムについて質問です。
https://daeudaeu.com/socket/#:~:text=%E7%B5%82%E4%BA%86%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88%E9%80%9A%E4%BF%A1%E3%81%AE%E7%B0%A1%E5%8D%98%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BE%8B,-%E3%81%A7%E3%81%AF%E3%80%81%E3%81%93%E3%81%93%E3%81%BE%E3%81%A7

プログラムの内容をよく考えていると、以下のコードのところで引っかかりました。

サーバー・ソケットへの情報設定
if (bind(w_addr, (const struct sockaddr *)&a_addr, sizeof(a_addr)) == -1) {
	printf("bind error\n");
	close(w_addr);
	return -1;
}
サーバー・ソケットの接続待ち設定
if (listen(w_addr, 3) == -1) {
	printf("listen error\n");
	close(w_addr);
	return -1;
}
クライアント・接続要求送信
if (connect(sock, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) == -1) {
	printf("connect error\n");
	close(sock);
	return -1;
}

3つとも、いきなりif文に始まってif文で終わっているのです。if文1個だけで。しかも、if文内の処理文にはエラー時のパターンしか見受けられません。これでは、エラーなしに正常に実行されたらbindやlisten、connectは飛ばされてしまうのではないでしょうか?

0

3Answer

bind, listen. connect の各関数を呼び出して処理してもらい、もし処理中にエラーが発生したら戻り値が -1 になります。
なので、エラーなしのときには各処理が正常実行されています。

0Like

if 文の条件式の中で bind などを実行し、その返り値が失敗を表す -1 ならエラー時の処理をする、という流れになっています。

int result = bind(w_addr, (const struct sockaddr *)&a_addr, sizeof(a_addr));

if (result == -1) {
	printf("bind error\n");
	close(w_addr);
	return -1;
}

のようにも書けるところを、結果を入れる変数 result を省略して

if (bind(w_addr, (const struct sockaddr *)&a_addr, sizeof(a_addr)) == -1) {
	printf("bind error\n");
	close(w_addr);
	return -1;
}

にしたと考えれば納得できるのではないでしょうか。

0Like

@shiracamusさん、@uasiさん、ご回答ありがとうございます。
つまり、質問で挙げたプログラムでは、もしif文の条件式を書く部分の ( ) 内に処理文があれば それもきちんと実行される、といった感じですね。
納得出来るアドバイスで、とても助かりました!

0Like

Your answer might help someone💌