ページ 11

Binaryデータの送信量削減

Posted: 2012年9月13日(木) 17:27
by Gammodler1
VistaマシンからLinuxマシンにTCP/IPでunsigned longのRegisterを連続的に送っていますが、送信速度が2割ほど未達です。
回線は100Baseで改善の余地がありません。MTU=1500に設定。実績は約1.2MB/Sです。
送信側はRegisterを9バイトの文字列に変換、これを160個数珠つなぎにして送っています:
fread(&val, sizeof(unsigned long), 1, fp);
sprintf(fmt, "%s%d%s", "%", 9, "x\0");         // 送信用書式を作る
sprintf( str, fmt, htonl(val)); // 1Register = 9バイトの文字列に変換
strcat(sendStr, str); // 160個数珠つなぎにする
send(socket, sendStr, 160, 0); // 160X9=1440<1500(=MTU)

受信側
while(1){
recv(socket_s, rcvStr + rcvSize, 160 * 9 - rcvSize, 0);// Blocking Mode

// 9バイト+終端コードの文字列に切り出し
data = strtoul(regStr, NULL, 16); // Binaryに復元


この送受信にはかなりの無駄がありそうです。ご指摘いただければ幸いです。
受信側でRegister当たり0.1μsほどの処理時間増加はやむをえません。

Re: Binaryデータの送信量削減

Posted: 2012年9月13日(木) 21:58
by へにっくす
Gammodler1 さんが書きました:

コード:

	fread(&val, sizeof(unsigned long), 1, fp);
	sprintf(fmt, "%s%d%s", "%", 9, "x\0");	        // 送信用書式を作る
	sprintf( str, fmt, htonl(val));			// 1Register = 9バイトの文字列に変換
ここの部分は、こう置き換えられる。htonl省略しちゃってますがキニシナイ(ぉぃ

コード:

char str[8+1]={0}; // +1してるのは最後に必ず'\0'文字がはいるから
fread(&val, sizeof(unsigned long), 1, fp);
sprintf(str, "%0*x", 8, val); // MSDNのprintf関数の文字幅指定参照。valが255の場合は000000ffとなる
printf 関数の文字幅指定
そもそもバイナリをテキストに変換する必要あるのかいな?と思ったり。
私だったらそのまま送ります。

Re: Binaryデータの送信量削減

Posted: 2012年9月14日(金) 12:36
by Gammodler1
へにっくす様
Resありがとうございます。
Binaryは制御コードを含むためそのままでは送れないとの固定観念を持っていました。
もう一度検討し報告いたします。

Re: Binaryデータの送信量削減

Posted: 2012年9月21日(金) 18:18
by Gammodler1
へにっくす様
32bitデータ、binaryのまま送信することができました。
これでregister当たり9→4byteに削減でき、目標を達成することができました。

つまらない固定観念に囚われ、お騒がせしました。ありがとうございました。