2017-10-13 22 views
2

ネットワークスキャンユーティリティをビルドしていますが、リストビューに文字列を表示しているときに問題が発生しています。WindowsForm Appの文字列に文字列がありません

ソケットリクエストとバイトコードを使用してローカルリモートマシンのNetbios名を見つけましたが、結果をリストビューに表示するとドメイン名がまったく表示されませんが、リストビュー行のテキストをエクスポートするとこれは、 "COMPUTER1-WORKGROUP"のような文字列全体を正しく表示します。たとえば、リストビューの場合、 "COMPUTER1"だけが表示されます。

ここでは、Windowsアプリケーションでリストビューで表示を見ることができます:

enter image description here

あなたはそれが唯一の「NVRSERVEUR」

を表示する最初の行の「NOMのNetBIOS」の欄に見ることができるように

そして、私がListViewItem.SubItem.Textを取って、それを.csvファイルに書き込むと、下の画像でわかるように、IRISがネットワークドメイン名を表す "NVRSERVEUR-IRIS"と表示されます。ここで

enter image description here

私はNetBIOSコンピュータ名とネットワークのドメイン名を取得するために使用するタスクのコードである:ここで

static Task<NetworkInfosWrapper> getNetBiosNameAsyncReply(PingReply reply) 
    { 
     var tcs = new TaskCompletionSource<NetworkInfosWrapper>(); 
     byte[] receiveBuffer = new byte[1024]; 
     Socket requestSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
     requestSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 100); 
     EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(reply.Address.ToString()), 137); 
     IPEndPoint originEndPoint = new IPEndPoint(IPAddress.Any, 0); 
     requestSocket.Bind(originEndPoint); 
     SocketAsyncEventArgs e = new SocketAsyncEventArgs(); 
     e.SetBuffer(NameRequest, e.Offset, NameRequest.Count()); 
     e.RemoteEndPoint = remoteEndPoint; 
     e.Completed += (obj, sender) => 
     { 
      try 
      { 
       int receivedByteCount = requestSocket.ReceiveFrom(receiveBuffer, ref remoteEndPoint); 
       if (receivedByteCount >= 90) 
       { 
        Encoding enc = new UTF8Encoding(); 
        //Encoding enc = new ASCIIEncoding(); 

        string deviceName = enc.GetString(receiveBuffer, 57, 16).Trim(); 
        string networkName = enc.GetString(receiveBuffer, 75, 16).Trim(); 

        tcs.SetResult(new NetworkInfosWrapper(reply,(deviceName.Trim()+" - "+networkName.Trim()).Replace(" ", ""))); 

       } 
       else 
       { 
        tcs.SetResult(new NetworkInfosWrapper(reply, "N/A")); 
       } 
      } 
      catch 
      { 
       tcs.SetResult(new NetworkInfosWrapper(reply, "N/A")); 
      } 

     }; 
     requestSocket.SendToAsync(e); 
     return tcs.Task; 
    } 

は、私が主走査でリストビューに表示する方法です機能:ここでは

foreach (var netbiosTask in netbiosTasks) 
     { 
      if (netbiosTask.Result.reply.Status == IPStatus.Success) 
      { 
       ListViewItem lvi; 
       addr = IPAddress.Parse(netbiosTask.Result.reply.Address.ToString()); 
       string mac = ScanUtils.getMacByIp(netbiosTask.Result.reply.Address.ToString()); 

       lvi = new ListViewItem(ScanUtils.GetReverseDNS(netbiosTask.Result.reply.Address.ToString(),1000)); 
       lvi.SubItems.Add(netbiosTask.Result.reply.Address.ToString()); 
       lvi.SubItems.Add("UP"); 
       lvi.SubItems.Add(netbiosTask.Result.reply.RoundtripTime.ToString() + " ms"); 
       lvi.SubItems.Add(netbiosTask.Result.netBiosName); 
       lvi.SubItems.Add(mac); 
       lvi.SubItems.Add(ScanUtils.getMacvendor(mac)); 
       listView.Items.Add(lvi); 
       if(progressBar1.Value < progressBar1.Maximum) { 
        progressBar1.Value = progressBar1.Value + 1; 
       } 
       if (!mStopThread) 
       { 
        break; 
       } 
      } 
     } 

私は.csvファイルとしてリストビューの内容をエクスポートする方法です。

private void enregistrerBtn_Click(object sender, EventArgs e) 
    { 
     StringBuilder csvContent = new StringBuilder(); 
     csvContent.AppendLine("sep=;"); 
     csvContent.AppendLine("Hostname;Adresse IP;Netbios;Adresse Mac;Mac Vendor"); 

     foreach (ListViewItem item in listView.Items) 
     { 
      csvContent.AppendLine(string.Format("{0};{1};{2};{3};{4}", item.SubItems[0].Text, item.SubItems[1].Text, item.SubItems[4].Text, item.SubItems[5].Text, item.SubItems[6].Text)); 
     } 

     string csvPath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory).ToString() + @"\Resources\networkScan"+ DateTime.Now.ToString("dd-MM-yyyy-hh-mm-ss") +".csv"; 

     File.AppendAllText(csvPath, csvContent.ToString(),Encoding.UTF8); 
    } 

私は、ASCIIとUTF-8の両方のエンコーディングをcsvの書き込みとソケットの応答のバイトエンコーディングに使用しようとしました。 他にもこの種の問題が発生しましたか?

答えて

0

Trimは、デフォルトで文字列から空白文字のみを削除しません。あなたがnullのバイトは、あなたがそれらを表示する方法に依存した後、文字列の一部が表示されるかどうかは

string deviceName = enc.GetString(receiveBuffer, 57, 16).Trim('\0'); 
string networkName = enc.GetString(receiveBuffer, 75, 16).Trim('\0'); 

:特にこのようなNULLバイトを削除するTrimを適用します。あなたがCSVファイル(Excel?)を見るために使用するエディタがnullバイトの後に続けることができるように見えるとき、リストビューは、ヌルバイトを見るとき、テキストを印刷するのを止めます。

+0

すぐにお返事ありがとうございます、私はちょうどそれを試したし、実際に動作します!私は私の自己によってこれを見いだすことができたならば、私はあまり経験していません!私はExcelを使用して、私は非常にこれで混乱していた、今私は説明のおかげで理解する。おかげで –

+0

私はいくつかのデバイスのネットワークドメイン名のために私は不明な文字が表示されるので、いくつかの助けを使うことができます:https://imgur.com/qMKsAlr、いくつかの未知の文字を検出した場合、 、またはそれらをよりよく翻訳するかもしれませんか?ありがとう –

+0

[この質問]から 'TrimFromZero'関数を試してください(https://stackoverflow.com/questions/1403524/c-sharp-trimming-string-from-first-null-terminator-and-onwards) – NineBerry

関連する問題