
C言語でネットワークプログラミング(ストリーミングのプログラムを作成しました)
UDPを使用したプログラミングなのですが、サーバ側でデータを送るのが途中でいったん停止することがあるんです。数秒停止してまた送る。
もしクライアント側で何か処理が止まったときに、
ソケットのsendto(。。。。。)がブロックするのであればそのエラーもなっとくいくのですが。
sendtoってブロックするのでしょうか??
recvfrom()はソケットディスクリプタに応答があるまでブロックするのはわかるのですが・・・。sendtoはお構いなしに送信するんだったと思うのですが。
環境はサーバ、クライアントマシンともにlinux7.2です。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
sendto()のマニュアルにもありますが、socketがノンブロッキングモードでない限り、そのsocket用の送信データスペース(バッファ)が足りないと、ブロックします。
CPUが速い場合やネットワークが混んでいる場合に起きる可能性があります。UDPはいくらパケットの到着を保証しないといっても、送信側でCPUが速すぎたから消えるんではあんまりですよね?UDPでパケットが消えるのは、中継のルータでバッファがあふれたときくらいです。
もし、ノンブロッキングモードにしたいなら、setsockopt()とSO_SNDTIMEOオプションが絡むと思いますが、試したことはないのでわかりません。必要なら調べてみてください。でもこれをすると、バッファがあふれて送れない状況が頻出するのであまり好ましくないとは思います。
バッファの大きさもsetsockopt()で変更できるはずです。
送信側が本当にいつパケットを出したかを知るのは大変かもしれません。tcpdumpやetherealでパケットモニタリングできますが(スイッチングハブ越しではもちろん無理)、それでもモニタリングしているPCで受信した時刻しかわからないと思います。送信側PCで同時にモニタリングしてもいいでしょうが、別のプロセスが走る状況が好ましいかどうかによります。
バッファを最小限にしてsendto()が-1を返してerrno==EWOULDBLOCKだったら再送して、成功したときにその時刻を調べるというのアイデアもありそうです。
結局のところ、本当に知りたい時刻は何かということですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
ソケットのクローズについて
-
winsockを使った通信での同時接...
-
ソケットを用いた1対多通信につ...
-
ネットワークプログラミングに...
-
ソケット通信 同じポート番号...
-
RS-232Cのポート番号を知りたい
-
Connectエラーが出てしまう・・...
-
割り込み処理について
-
どうか、POSTでのファイル転送...
-
VB6のwinsockでconnectできない
-
recv関数でフリーズしてしまう
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
バックグラウンドのプロセスの...
-
パソコンの演算速度について
-
エクセルVBA 大容量CSVファイル...
-
VBSの処理中一旦処理を止めて再...
-
【C言語】再帰が時間がかかる...
-
子プロセスの状態を親プロセス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
Socket通信の0バイト受信について
-
Winsockで接続待ちタイムアウト...
-
ソケットのクローズについて
-
UDP通信におけるbind関数について
-
VB6のwinsockでconnectできない
-
エクセル VBA でのCOMポート...
-
SIPがNATを越えられない理由
-
ソケットでクライアントのipア...
-
UdpClient 送信元のIPアドレ...
-
ソケット通信 同じポート番号...
-
VC++でのソケット通信について
-
TCP/IPプログラミングでのselec...
-
ソケット通信
-
ソケットのrecvの戻り値が0
-
UDP通信する時に、相手にどうや...
-
vxWorks6.4を使用してソケット...
-
SendRequestでヘッダが受信され...
-
ソケットを用いた1対多通信につ...
-
どうか、POSTでのファイル転送...
おすすめ情報