2009-07-20 8 views
1

linuxを使用してTCPソケットを使用してイメージを転送しようとしています。私はコードを何度も使って少量を転送していますが、画像を転送しようとするとすぐに最初の3分の1しか転送しませんでした。 linuxにtcpソケット用の最大バッファサイズが存在する可能性はありますか?どうすればそれを増やすことができますか?プログラムでこれを行う関数はありますか?LinuxでTCPソケットを使用してイメージを転送する

+0

どのくらいのデータが得られますか? – Javier

+1

私は800x600x3(1440000バイト)を送っています。私は65536バイトしか受け取りません。 – DHamrick

+0

コードはありますか? TCPはストリームであり、メッセージ指向ではないことに注意してください。 書き込みコールを1回実行すると、複数の読み取り呼び出しが必要になることがあります。あるいは、いくつかの書込み呼び出しは、受信するために書込み呼び出しを1回だけ必要とすることがある。 write()の戻り値をチェックすることを忘れないでください。すべてのデータを書き込むのはあなたの責任で、write()呼び出しはデータの一部だけを送るかもしれません。 – nos

答えて

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です。私はそれが偶然であるとは思わない。

関連する問題