setsockopt?など

たびたびお世話になります。尾崎と申します。

(1)ソケットプログラミングにおいて、UDPのチェックサムの設定を
オフにできるとの説明をみたのですが、具体的にはsetsockopt()で
するのでしょうか?
setsockopt()のヘルプが少なくてよくわかりません。
(2)あと、UDPで一度に送信指定できる最大バイト数(オクテット数)は
IPヘッダ16ビット65536バイト-IPヘッダ20バイト=65516バイト
でいいのでしょうか?
(3)また、TCPでは送信したデータがキューに残っているのですが、
Javaでいうflushに相当する関数はCのソケットAPIにはないのでしょうか?
仮に、わずかなバイトが送信されずに残った場合、受信側ではデータが
全て届かないので困ることになります(実際にはこういうことは起こらないのですが・・)。

以上、お手数おかけしますがお願いします。

名前: 
尾崎敏之
日時: 
02/06/19 01:23

コメント

尾崎さん,こんにちわ。

プログラミングが具体化してきたのでしょうか,
だんだん,難しい領域に入ってきてますね。

>(1)ソケットプログラミングにおいて、UDPのチェックサムの設定を
>オフにできるとの説明をみたのですが、具体的にはsetsockopt()で
>するのでしょうか?

いやー,これはわかりません。
ゴメンナサイ。

>(2)あと、UDPで一度に送信指定できる最大バイト数(オクテット数)は
>IPヘッダ16ビット65536バイト-IPヘッダ20バイト=65516バイト
>でいいのでしょうか?

UDPヘッダの分も考えなくちゃいけないと思います。
つまり,
 UDPメッセージのユーザデータ長
  =IPメッセージ長-IPヘッダ長-UDPヘッダ長
  =65,535-20-8
ということです。
それから,IPヘッダにオプションフィールドが付加されると
その分IPヘッダ長が長くなりますから,それも考えておいた方がいいでしょう。

>(3)また、TCPでは送信したデータがキューに残っているのですが、
>Javaでいうflushに相当する関数はCのソケットAPIにはないのでしょうか?

えーと...
何かあるはずですね~,あったはずだなぁ...っていう程度しか思い出せません。
これも,ゴメンナサイ。
socketのオプションか,そうじゃなかったら,sendとかrecvとかいう関数のように,
独立した関数でコントロールするのだったかもしれません。
TCP_NODELAYとか,fcntlとか,ioctlとかいったキーワードで,
Google辺りを検索してみると何か出てくるかもしれません。
こんなページも参考になるかも。
http://www.faqs.org/faqs/unix-faq/socket/

でも,この領域になると,ドキュメントを読むだけじゃなくて,
ソースコードを読んでみたり,プログラムでいろいろ試したり
することをお勧めします。