2017-08-04 4 views
0

外部システムと通信するときに、レスポンスの終わりにヌルバイトを追加します。しかし、私はいくつかの問題に直面している:「hardcodedResponse」▒続く:文字配列内の16進数で、ソケットに書き込むときにランダムな文字が返される

//reading from socket 

//sending response 
std::string response = "hardcodedResponse"; 
int bufferSize = response.size() + 1; // +1 for the trailing zero 
char buffer[bufferSize];  

for (int i = 0; i < response.size(); i++) 
{ 
    buffer[i] = response[i]; 
} 

buffer[bufferSize] = 0x00; 

int socketfd = 1; 
unsigned bytesWritten = 0; 

while (bytesWritten < bufferSize) 
{ 
    bytesWritten += ::write(socketfd, buffer[bytesWritten], bytesToWrite - bytesWritten); 
} 

を私はソケットに何かを送信するためにTelnetを使用する場合、私は応答を受信します。私は0x00がヌルなので意味があると考えました。しかし、最後に0x41(A)を追加すると、 "hardcodedResponse" +(一見すると)ランダムな文字が返されます。ソケットに書き込む前にバッファの最後の文字を印刷すると、 'A'が表示されます。これは、外部システムが正しいバイトを受け取るかどうかは関係ありませんが、まあ、ランダムなものを受け取ります。

なぜこのようなことが起こっているのですか?うまくいけば誰かが私の理解を助けることができます。別にすべてのソケットから

答えて

1

、バッファ長とどこがnullを入れて見てください:

std::string response = "hardcodedResponse"; 
int bufferSize = response.size() + 1; // +1 for the trailing zero 
char buffer[bufferSize]; //Up to, but not including bufferSize 
          //0, 1, ... bufferSize-1 

for (int i = 0; i < response.size(); i++) 
{ 
    buffer[i] = response[i]; 
} 

buffer[bufferSize] = 0x00; //BOOM udefined behaviour 

あなたがnullでなく、2のための1つの余分な文字を作った、そうではない超えて終わりにヌルを置きます終わり。

+0

くそーを、私は私は完全にそれを見ていない16進/ソケットの部分に焦点を当てていた。ありがとう:) – Aelion

1

まず、「可変長配列」と呼ばれる非標準機能に頼っています。 VLAは数少ないC++コンパイラでしかサポートされておらず、オプションの拡張機能としてサポートされています。動的サイズの配列の代わりに、STL std::vectorコンテナを使用する必要があります。

さらに重要なことに、間違った配列インデックスにnullバイトを書き込んでいます。 buffer[]の有効なインデックス範囲は0..bufferSize-1です。 buffer[bufferSize]に書き込むと、データの末尾にある正しい位置にヌルターミネータが追加されず、周囲のメモリがゴミ箱になります。

あなたはこれを変更する必要があります。これに

buffer[bufferSize] = 0x00; 

buffer[bufferSize-1] = 0x00; 

あなたはまた、いずれか、正しくwrite()に電話を管理していません。特に、エラーで-1を返すことができますが、これは処理していません。 bytesToWriteの代わりにbufferSizeを使用する必要があります。

//sending response 
std::string response = "hardcodedResponse"; 
const char *buffer = response.c_str(); 
const size_t bufferSize = response.size() + 1; // +1 for the trailing zero 

size_t totalWritten = 0; 
ssize_t bytesWritten; 

do 
{ 
    bytesWritten = ::write(socketfd, buffer[totalWritten], bufferSize - totalWritten); 
    if (bytesWritten <= 0) 
    { 
     // handle error... 
     break; 
    } 
    totalWritten += bytesWritten; 
} 
while (totalWritten < bufferSize); 

または::言われて、あなたが実際にすべてのbuffer[]配列を必要としない代わりに、あるとして、あなただけのstd::stringデータを送信できること

//sending response 
std::string response = "hardcodedResponse"; 
const char *buffer = response.c_str(); 
size_t bufferSize = response.size() + 1; // +1 for the trailing zero 

size_t totalWritten = 0; 
ssize_t bytesWritten; 

do 
{ 
    bytesWritten = ::write(socketfd, buffer, bufferSize); 
    if (bytesWritten <= 0) 
    { 
     // handle error... 
     break; 
    } 
    buffer += bytesWritten; 
    bufferSize -= bytesWritten; 
} 
while (bufferSize > 0); 
関連する問題