linuxを使用してTCPソケットを使用してイメージを転送しようとしています。私はコードを何度も使って少量を転送していますが、画像を転送しようとするとすぐに最初の3分の1しか転送しませんでした。 linuxにtcpソケット用の最大バッファサイズが存在する可能性はありますか?どうすればそれを増やすことができますか?プログラムでこれを行う関数はありますか?LinuxでTCPソケットを使用してイメージを転送する
1
A
答えて
1
TCPはデータを分割して送信するため、1回の読み取りで一度にすべてのデータを取得することは保証されていません(ただし送信順序は変わりません)。基本的には、すべてのデータを取得するまで複数回読む必要があります。また、受信側で送信したデータの量もわかりません。通常は、固定サイズの「長さ」フィールド(たとえば、常に8バイト)を送信して、データの量を知ることができます。それからあなたは、あなたがその多くのバイトを得るまで、バッファを読んで構築し続けます。
ので、送信者が
int imageLength;
char *imageData;
// set imageLength and imageData
send(&imageLength, sizeof(int));
send(imageData, imageLength);
をこの(擬似コード)のようになります。そして、受信機は、この(擬似コード)のようになります
int imageLength;
char *imageData;
guaranteed_read(&imageLength, sizeof(int));
imageData = new char[imageLength];
guaranteed_read(imageData, imageLength);
void guaranteed_read(char* destBuf, int length)
{
int totalRead=0, numRead;
while(totalRead < length)
{
int remaining = length - totalRead;
numRead = read(&destBuf[totalRead], remaining);
if(numRead > 0)
{
totalRead += numRead;
}
else
{
// error reading from socket
}
}
}
はもちろん、私は、実際のソケット記述子をオフに左、あなたが必要ですそのすべてに多くのエラーチェックを追加する必要があります。それは完全であることを意図したものではなく、そのアイディアを示すために多くのことを意味しました
3
ソケットから読み取ったときに問題が受信側にあると思います。 TCPは、パケットまたはメッセージの境界が分からないストリームベースのプロトコルです。
これは、読み取りを実行すると、要求したバイト数よりも少ないバイト数が得られる可能性があることを意味します。たとえば、画像が128kの場合、最初の読み取りでは24kしか得られず、残りのデータを取得するために再度読み取る必要があります。それがイメージであるという事実は無関係です。データはデータです。例えば
:
int read_image(int sock, int size, unsigned char *buf) {
int bytes_read = 0, len = 0;
while (bytes_read < size && ((len = recv(sock, buf + bytes_read,size-bytes_read, 0)) > 0)) {
bytes_read += len;
}
if (len == 0 || len < 0) doerror();
return bytes_read;
}
0
1つのIPパケットの最大サイズは、あなたがヒットしている数に極めて近いある、65535です。私はそれが偶然であるとは思わない。
関連する問題
- 1. TCPソケットを使用してビットマップを転送する方法
- 2. javaでソケットを介して565RGBイメージを転送する
- 3. LinuxでTCP/IPを使用して生データを送信する
- 4. lighttpdを使用してTCPソケットにリクエストを送信する
- 5. Pythonを使用してファイルを送受信するTcpソケット
- 6. CでUDPソケット上のファイルを転送しています! Linux
- 7. ソケットを使用してMonoDroidでデータを転送する
- 8. BufferWriterとBufferReaderを使用してTCPソケットで画像を送信
- 9. Java - TCPソケット経由でBufferedImageを転送する
- 10. ソケットを使用したポート転送
- 11. ブロックモードのLinux TCPソケット
- 12. Pythonソケットを使用してGPSデータを転送する方法
- 13. CFWriteStreamを使用してファイルをソケットに転送する
- 14. Javaソケットを使用して大量のデータを転送する
- 15. OpenCVとRaspberry Piのソケットを使用してビデオ送信TCP
- 16. Tcpソケットを介してファイルサイズを送信
- 17. Linuxでrawソケットを使用してリスニング用のTCPソケットを作成できますか?
- 18. ソケットを複数回使用してTCPを送信して受信する(C#)
- 19. Spark Structured Streaming用のTCPソケットを使用してデータを送信する方法
- 20. ファイルポインターを使用してTCP経由でファイルを転送する際の問題
- 21. LinuxでCでRAWソケットを使用してマルチキャストを送信する
- 22. LinuxカーネルTCPソケットの変更
- 23. Linuxソケット:ゼロコピーローカル、TCP/IPリモート
- 24. LinuxのTCPソケットのタイムスタンプオプション
- 25. Cでソケットを使用してTCPフォワーダを改善する#
- 26. TCPソケットを使用してローカルでビデオをプロキシする
- 27. Javaソケットを使用してクライアントとサーバ間でファイルを転送する方法
- 28. VB.NETのソケットを使用してTCP経由でバイト配列を送信
- 29. TCPビデオファイル転送
- 30. linuxのソケットでクエリを送信するバッファの使用
どのくらいのデータが得られますか? – Javier
私は800x600x3(1440000バイト)を送っています。私は65536バイトしか受け取りません。 – DHamrick
コードはありますか? TCPはストリームであり、メッセージ指向ではないことに注意してください。 書き込みコールを1回実行すると、複数の読み取り呼び出しが必要になることがあります。あるいは、いくつかの書込み呼び出しは、受信するために書込み呼び出しを1回だけ必要とすることがある。 write()の戻り値をチェックすることを忘れないでください。すべてのデータを書き込むのはあなたの責任で、write()呼び出しはデータの一部だけを送るかもしれません。 – nos