連載2 画像転送システム その5
送信処理で重要なのが一度に送信するバイト数で、大きすぎても小さすぎてもパフォーマンスは低下します(なんだかハードディスクドライブのアクセスのコツと似ていますね)。
例えば1MBのデータを送信するのに
send( socket, (char *)lpbuff, 1024*1024, 0 ); |
とまとめて送信するよりも
for( DWORD i=0; i<1024*1024; i+=4096 ) send( socket, (char *)((DWORD)lpbuff + i), 4096, 0 ); |
の様に4096バイトずつこまめに転送する方が早く転送できるようです。私の場合には6kByteくらいで分割すると最も良い結果がでました。理由は不明ですがジャンボフレームなどが影響しているのかな?
と言う事で、次のような送信関数を使っています。
// 最大送信サイズ(これより大きいデータは、このサイズに分割して送信します。) #define PAKET_DATA_SIZE (2048*3) // 送信するデータが大きすぎるとパフォーマンスが低下するので // 一定の大きさ(PAKET_DATA_SIZE)に分割して送信します。 int send_all( SOCKET s, char *buf, int len, int flags ) { char *p = buf; int left = len; while(left) { int send_size = PAKET_DATA_SIZE; if (left < PAKET_DATA_SIZE) send_size = left; int size = send( s, p, send_size, 0 ); if (size == SOCKET_ERROR) return SOCKET_ERROR; left -= size; p += size; } return len; } |
- 関連記事
trackback
コメントの投稿