• 締切済み

C言語の標準関数のエラー

現在ソケット通信でデータを送受信するプログラムを作っています。 通信してデータのやり取りする部分はできたので、関数のエラーチェック、異常が発生したときの処理を追加しているところです。 異常時の処理は、エラーの通知・メモリの解放など行っている感じです。 今エラーの判断を行うのに関数の戻り値を利用しているのですが、ふと疑問が浮かんできました。 それは、関数がエラーを返すときはどういうときなのか、つまり、エラーが発生する原因はなんなのか?ということです。 関数について解説しているHPを見ても、戻り値は載っていてもなぜその戻り値が返ってくるのか、といった原因まで解説してくれているところがありません。 標準関数について、エラーが返る原因を解説しているHPはあるでしょうか。もし知っている方がいれば教えていただけると幸いです。 HPでなくても、他に調べる方法があればご教授お願いします。 特に通信用の関数について知りたいというわけでなく、エラーについて興味があるといった感じです。 ・・・といいつつも、ソケット関数について教えていただければ例外処理も考え易いかなと思っています^^;

みんなの回答

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.4

>   戻り値 -1:~に失敗した時 >っていうのがあったとして、失敗した時に-1が返るのは見れば当然わかる >ことですが、 >なぜ失敗するのかまでがわからない、といった感じです。 マニュアルを最後まで全部読んでますか? いちいち書かなくても常識的(TCP/IPを知っていれば)に理解できる事もありますし、マニュアルに書いてあることもあります。 たとえばconnectだと、 RETURN VALUES   成功したら0、失敗したら1を返します (略) のあとに、 ERRORS The connect() system call fails if: [EBADF] The s argument is not a valid descriptor. [ENOTSOCK] The s argument is a descriptor for a file, not a socket. [EADDRNOTAVAIL] The specified address is not available on this machine. (以下略) みたいに、細かい原因がずらずらと列挙されていますが。

nanayarawa
質問者

お礼

横着者の質問に2度も答えていただけるなんて・・・・。 (回答の)質問は↑の補足の通りです。 予想通りのクレクレ厨かって感想だと思いますが(^-^; 知識不足っていうより、やる気不足ですね・・・。 マニュアルがあるということを教えて(?)いただきありがとうございます。 意図したことではないと思いますが、知らなかったもので(正確には知る気がなかったですね)。 引き続きの回答ありがとうございました。 ・・・マニュアルがないわけないじゃん!!!というツッコミやらお叱りやらは覚悟の上です^^;

nanayarawa
質問者

補足

>マニュアルを最後まで全部読んでますか? えぇっと・・・ごめんなさい、読んでないです。 というかマニュアルと呼ばれるものを知りませんでした。 ・・・なんて言ったら怒りますよね(^-^; ろくに調べもせずに楽して知りたいっていう甘い考えを持ってました。 >常識的(TCP/IPを知っていれば)に理解できる事もありますし TCP/IPについては素人なんで勉強と平行しつつ調査したいと思います。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.3

マニュアルに書いてあるエラーコードを見れば、それ自体がどういう時にエラーが起きるかの説明に十分なっているはずなのですが。 TCP/IP通信について勉強されたらどうでしょうか。

nanayarawa
質問者

お礼

回答ありがとうございます。 >TCP/IP通信について勉強されたらどうでしょうか。 ごもっともです。 勉強した上で質問するべきでしたね。 プログラミングのことばかり意識していたもので、 TCP/IP自体の勉強が疎かになってしまいました。 >マニュアルに書いてあるエラーコードを見れば、 >それ自体がどういう時にエラーが起きるかの説明に十分なっているはずなのですが 例えば     戻り値 -1:~に失敗した時 っていうのがあったとして、失敗した時に-1が返るのは見れば当然わかることですが、 なぜ失敗するのかまでがわからない、といった感じです。 私の調べ方と知識の足りなさが問題だと思うので、引き続き調査・勉強を行い、 それでも不明な点があれば再度質問するといった感じにします。

  • _himajin_
  • ベストアンサー率65% (128/195)
回答No.2

戻り値の説明(お使いの開発環境のマニュアル または http://www.linux.or.jp/JM/html/LDP_man-pages/man2/socket.2.html など)だけでは不足と言うことでしょうか。 Linuxや*BSDなどフリーな環境限定かつ実装依存になってしまいますが、glibcなどライブラリのソースを見る、と言う手はどうでしょう? # と、おもったら http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2 の socket/socket.c には中身がないなぁ… すべてを網羅してるわけではないようですが、標準Cライブラリを実装したものを公開している方などもいらっしゃいます。 http://libc.blog47.fc2.com/

nanayarawa
質問者

お礼

回答ありがとうございます。 >戻り値の説明だけでは不足ということでしょうか。 現時点でこの知識が必要か、と言われたら返答に詰まりますね^^; 課題程度のプログラムであれば戻り値だけみれば問題ないと思いますし・・・。 ただ、これからプログラムで飯を食っていく、ということで興味があることは調べていこうかなと思っています。 ちなみに自分は高校卒業したばかりのピカピカの社会人一年生です(笑) 参考URLの「標準Cライブラリの実装」ですが、軽く目を通した感じだと解説もあり、自分で解読するより理解できそうです。

  • bardfish
  • ベストアンサー率28% (5029/17766)
回答No.1

通信関連の関数というとsockets.libを真っ先に思い浮かべます。 まっとうなコンパイラを使用していればLIBのソースコードがついているはずです。そのソースを読めばエラーの原因が特定できます。 各種libのソースがあるわけですから、それを詳細に解説したHPや書籍など皆無です。少なくとも私は見たことありませんし、ソースを見れば理解できます。 と言っても低レベルI/Oの集まりなので、I/Oエラーの場合はハードに起因したり、ネットワーク系だとネットワーク構成に起因するエラーもあります。 ソースが読めるだけでは解決に至らない場合もあるのでそれなりに広い知識が必要です。

nanayarawa
質問者

お礼

回答ありがとうございます。 >まっとうなコンパイラを使用していればLIBのソースコードがついているはずです。 >そのソースを読めばエラーの原因が特定できます。 なるほど。 そういった手があるのですね。参考になります。 っといっても私は知識があるほうではないので、理解には苦しむと思います^^; 関数のエラーの原因解明を目的として、システムやハードウェアについても学ぶことにします。 迅速な回答ありがとうございました。

関連するQ&A