SPACEKEY

Technical Memorandum

TCP通信

November 19, 2013

C#とMongoDBを使ったクライアントサーバー的なあるシステムをちょこちょこと作り続けているのですが、ある不具合が解消できなくて夢にまで出てくるようになりました。

サーバー側はIISとかその辺を使わず単体で動いて欲しかったので、ソケット通信でJSONデータをやりとりするように作っていて、なかなかめんどくさかったのですがプログラム的には一応動作するようになり、小さいデータのやりとりでは特に問題ない状態でした。 が、一度に大きなデータを扱うとクライアント側の受信データが乱れる現象がちらほらと発生するように……

データの乱れ方も一定ではなく、後ろが切れている、途中が化けている、途中の一部分が何度も繰り返されている……など、デバッグするたびに違う現象が発生しておりました。 サーバー側の出力時点は問題なく、クライアントが受信した直後のデータがおかしくなっている……ということは、TCPの通信で何か起きているのは間違いないのです。

まあ、このシステムは実際のお仕事ではなく、個人の趣味の範囲(にしては業務チックですが……)なので、受信データが壊れていたら再送とかそう言うので回避していたんですが、やっぱりなんか安定しない……

もしかしたら自分のソケットプログラミングがいけてないのかも……と思って、通信する部分をAlchemyというWebSocketコンポーネントを使って書き直したんですね。 詳しくはまた別に書くかもしれませんけど、もう自前でやりとりするより遙かに簡単なのでさくっと置き換えることができて、これまで頑張って書いたプログラムは何だったんだと思わなくもないですが、それは修行と思うことでよしとしましょう。

で、単純な動作的には問題なく動くようになってホクホクしていたんですが、いざ大きなデータをやりとりするとなんかエラーが出るのです。初めて使うものなので、何か使い方を間違ってるんじゃないかとか色々調べたんですが、結局はソケット通信でやってるのと同じ不具合っぽいのです。

原因ははっきりしないのですが、Windowsの通信部分に何かあると考える以外になさそうなのですよね。バッファがあふれちゃってるとかなんかそういうことなのかも……同一のPCでやりとりしていることもあるのかもしれません。

今日も朝から夢の中でデバッグしていてゆっくり寝た気がしない感じです。