dポイントプレゼントキャンペーン実施中!

こんばんわ。
winsockを用いてC言語によるソケットプログラミングを行なってます。

ソケットを(SOCKET s1,s2)用いているのですが、両者はローカルで指定しています。しかし、私のプログラミングの記述の仕方が悪く・・・

もし、エラーが発生した場合、s1はクローズできる仕様なのですが・・・s2をクローズできないプログラムになってしまいました。

エラーが発生時、プログラム自体を終了する・・とした場合、ソケットはクローズされるのでしょうか?

また、テキストには必ずソケットをオープンした場合クローズする必要があると書いてあるのですが、どういう意味でしょうか?

ローカルからグローバル変数へ変更すれば解決できるのですが、グローバル変数へ変更しても大丈夫でしょうか?

よろしくお願い致します。

A 回答 (2件)

ソケットハンドル自身をグローバル変数にするのが恐いのであれば、


グローバル変数でフラグをとり、エラーが起きたらフラグを立て、その値を見てクローズすればどうでしょう?
    • good
    • 0

そういう場合、クローズというか破棄されるという方が近いかと。


一応、Windowsはリソースを回収しますが、ゴミ扱いみたいなもので、丁寧には扱ってくれません。
# リソースを取り上げたいだけなので、まぁ地上げみたいなものでしょうか。

セッションとか張ってると相手に正しく終了が通知されないとかありますし、
そもそものプログラムのお約束として、開いたら閉じるのは基本です。
# 自動で閉じるデストラクタ等も昨今はありますが、WinSock等の
# C言語風APIでは、閉じない≒バグ、みたいなものです。

テキストが指摘しているのもこういうことが背景にあるのでしょう。

グローバルに変更して大丈夫か否かは、見てみないことにはなんともいえません。
# 水に答えられたら憶測に終始するか、実は関係者か超能力者か…。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!