2016-12-09 13 views
0

ソケットを介して1文字を送信したい。受信側では、常にヌル文字として終了します。助言がありますか?C++シングルキャラクタがソケット経由で送信されない

これは常に実行されます一部

一部

boost::array<char, 7> buf; 
char *raw_data = buf.data(); 
boost::asio::ip::address ip_addr; 
int port; 

read((*serve_socket), boost::asio::buffer(buf)); 
in_addr ip_raw = *(in_addr *)(raw_data); 
ip_addr = boost::asio::ip::address::from_string(inet_ntoa(ip_raw)); 
port = ntohs(*(short *)(raw_data + 4)); 
char sig = ntohs(*(char *)(raw_data+6)); 

を受け

char message[7]; 
in_addr addr; 
inet_aton(splitter_socket_.local_endpoint().address().to_string().c_str(), &addr); 
(*(in_addr *)&message) = addr; 
(*(uint16_t *)(message + 4)) = htons(splitter_socket_.local_endpoint().port()); 
(*(char *)(message+6))=htons('M'); 
splitter_socket_.send(boost::asio::buffer(message)); 

を送信します。意味は、sigは常にヌル文字です しかし私は 'M'を送っていました。それは欠けている。

if(sig==0){ 
    number_of_monitors_++; 
    TRACE("The number of monitors increased to "<<number_of_monitors_); 
} 

私が正しくあなたが「M」にhtonsをやっている

+0

私はASIOを知らないが、私はそれが非同期であることを知っている。 'send'を呼び出した関数からASIOがバッファを使用していないことを確かめていますか? –

答えて

4

受信されて送信していたデータの残りの部分。

これは、 'M'を短くしてから、(あなたがリトルエンディアンマシンになっているので)バイトスワップするので、送信しているのは、 'M'は正であることが保証されているため、0になります。

charshortではないため、1として扱うべきではありません。そのままcharを送信してください。

+0

1バイト長のArent文字? – Rakshith

+0

@Rakshith:はい、しかし、短さは2バイトです。 'htons'はパラメータとしてshortをとり、shortを返すので、' htons'を呼び出すと、あなたのcharは 'short'に昇格します。 –

関連する問題