忍者ブログ

佐崎司と愉快な仲間達

ゲーム、アニメ、CG、iOS開発など思いついたことを記事にしています。 管理人が3人いますので、記事にまとまりはないと思います。 iPhoneアプリのレビュー依頼も受け付けています。

send関数で送信成功(返り値)にも関わらず、実際には送信されない件について

わか

iOSでsend関数を使用して端末間でデータの送受信を行っていましたが、
たまにsend関数が成功(返り値&errno)しても実際には送信されない現象が発生しました。

いろいろ調査した結果、TCP_NODELAYを設定すると多少は改善されました。
小さなデータを大量に送信する場合は、送信側でTCP_NODELAYを設定することが
推奨されているようです。
(TCP_NODELAYを設定しないと、Nagleアルゴリズムが有効になるみたいです。
Nagleアルゴリズムとはデータ通信を効率的に行うアルゴリズムだそうですが、
通常は無効にするのが定石のようですね。)

ただそれだけでは、まだ現象が発生していました。
そこで、送信されない電文を再送してみると、
前回の送信されなかった電文と、再送した電文がまとめて送信されました。
なぜそのような事になるかは分かりませんでしたが、とりあえず必要ない
受信電文は無視することで解消しました。

データ通信を安定してやり取りさせるのは難しいですね・・・

拍手[0回]

PR