C # проблема со строкой, полученной на сокете tcpclient - PullRequest
1 голос
/ 18 октября 2019

У меня есть код C # клиента tcp. Он отлично работает для подключения к любому порту и получения данных. Он отлично работает и с Linux / Unix-серверами. Но в одном случае, когда я подключаюсь к серверу Linux (openwrt), я могу получать данные, но не могу показать строку. Код показывает, что строка содержит то, что я хочу, но MessageBox.Show не показывает строку.

В чем проблема?

string ip = "192.168.0.1";
string command ="MT15";
string result = "None";

int i = 0;
int bytesRead;

byte[] rec_message = new byte[65535];

StringBuilder Whole_Message = new StringBuilder();
int port = 8889;

var client = new TcpClient();

NetworkStream ns;
int total = 0;

if (!client.ConnectAsync(ip, port).Wait(1000)) 
{ 
     result = "Failed"; 
}

byte[] byteTime = Encoding.ASCII.GetBytes(command);
ns = client.GetStream();
ns.Write(byteTime, 0, byteTime.Length);

// the string.contain Shows the string contains the mac address
while (!result.Contains("C2:04:28:00:5F:F1"))
{
    bytesRead = ns.Read(rec_message, 0, rec_message.Length);
    total = total + bytesRead;

    result = Encoding.ASCII.GetString(rec_message, 0, total);
    Whole_Message.AppendFormat("{0}", result);

    //row = Whole_Message.ToString().Split(',');
}

string r = Whole_Message.ToString();
// the string.contain returns true, so the string contains the mac address

if (r.Contains("C2:04:28:00:5F:F1"))
{
    MessageBox.Show(r);
}

client.Close();

Но в MessageBox отображается только "MT15"

Результат прослушивания пакета tcpdump:

18:06:21.430073 IP 192.168.0.2.6481 > 192.168.0.1.8889: tcp 4
E..,HX....cg%...%....Q".....5#v.P.@t....MT15..

18:06:21.439163 IP 192.168.0.1.8889 > 192.168.0.2.6481: tcp 0
E..(*.@.=..,%...%..."..Q5#v.....P....|..

18:06:21.475525 IP 192.168.0.1.8889 > 192.168.0.2.6481: tcp 23
E..?*.@.=...%...%..."..Q5#v.....P.......MT15..C2:04:28:00:5F:F1

Сообщение"MT15..C2: 04: 28: 00: 5F: F1", но в окне сообщений отображается только "MT15", это не проблема с окном сообщений, я не могу сохранить и прочитать в datatable или debug.write.

1 Ответ

1 голос
/ 18 октября 2019

Это звучит , как будто в ваших данных есть нулевые символы, которые некоторые API (и особенно: основные API-интерфейсы Windows, такие как MessageBox) будут восприниматься как стиль Cзавершенная строка. Смущает то, что не все API будут делать это, особенно в управляемом коде, где строки не должны заканчиваться нулем.

Например:

MessageBox.Show("hello\0world");

только показывает hello в окне сообщения:

enter image description here

При отображении нулевых символов, вероятно, следует задать фундаментальный вопрос, то есть эти данные вообще текстовые ;если вы счастливы, что это так, то вы, вероятно, можете просто раздеть их:

string s = ... // might contain null characters
s = s.Replace("\0",""); // now it doesn't
...