• ベストアンサー

TCP/IPで受信エラー

自作Linuxマシン:クライアント、Windows:サーバの組み合わせで、TCP/IPによる大量受信をすると1000回に1回程度 "could not read received packet length error=7"というエラーがでます。実際に受信内容が化けていることも正常なこともあります。 受信側: Linux-2.6.18-at9 Debian。PowerPc 300MHz 100Base 送信側: Vista Ultimate Core-duo 1.2GHz です。 このエラーはGrepした結果、/drivers/net/temac/adaptor.cというデバイスドライバのFifoReceiveHandlerというモジュールが発しているらしいことが分かりました。 受信側プログラム: void* tcpReceiveThread(void* pParam) という受信専用のスレッドを設け、 while(1){ rcvSize = recv(socket, buf, 1024*9, 0); // Blocking Mode  ・・・・データ処理 } で常時待ちます。 Windows側には別のprocess側チャネルで送信要求をだします。 送信側プログラム:  int ok = send(socket_h, buf, 1024*9, 0); これを1回の送信要求に対し2回続けて実行します。 Windows側は同じPortNoでacceptしてあります。 不具合の推定原因: 1.受信側データ処理が重く、2回目の送信データが処理しきれていない。データ処理は1ms程度 2.受信process側の処理が重く、受信スレッドにリソースが回らない。 3.一回の送受信データ1024*9バイトが大きすぎる。あるいは必要な設定を行っていない。 などが考えられます。実行の時間的制約が厳し過ぎるのかもしれません: 受信側マシン全体で13msの間にコアジョブ3msと2個以上のpacket(1024*9)を受信しなければなりません。 ご示唆願えることがあればお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • unacyo
  • ベストアンサー率51% (35/68)
回答No.1

もしかして、バッファサイズが小さいのかもしれません。 setsockopt()のSO_RCVBUFでソケットの受信バッファサイズを64Kなりもっと大きくしてみたらどうでしょうか?

gammodler
質問者

補足

unacyo様 回答ありがとうございます。 さっそく試みたのですが、つまらないことで中断しています。 int ret = setsockopt( socket, SOL_SOCKET, SO_RCVBUF, (const char*)&sock_buf_size, sizeof(sock_buf_size) ); において initializer element is not constant というエラーがでます。 sock_buf_sizeの定義を const int sock_buf_size = 0x10000; static int sock_buf_size = 0x10000; static const int sock_buf_size = 0x10000; int sock_buf_size = 0x10000; としてみたのですが、いずれもNGでした。 gccに不慣れ、ご示唆願えることがあればお願いいたします。