Binaryデータの送信量削減
Posted: 2012年9月13日(木) 17:27
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ほどの処理時間増加はやむをえません。
回線は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ほどの処理時間増加はやむをえません。