2016-08-15 98 views
1

我正在編寫一個(希望是簡單的)控制檯應用程序,以將命令發送到運行telnet的音頻設備。這些命令允許我改變其中包含的DSP組件的狀態,例如:ToneGen set mute true執行Telnet握手

我遇到問題的地方是telnet握手,我知道有很多從Telnet服務器發送到客戶端的命令,並且客戶端需要響應這些命令才能成功協商會話開始。我只是不知道發送正確的命令。下面是我的一些不成功的嘗試。

這裏是我的代碼至今:

using System; 
using System.IO; 
using System.Net; 
using System.Net.Sockets; 
using System.Text; 

namespace telnetTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IPAddress address = IPAddress.Parse("192.168.10.101"); 
      int port = 23; 
      IPEndPoint endpoint = new IPEndPoint(address, port); 
      Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

      Console.WriteLine("Establishing Connection to {0}", address); 

      s.Connect(endpoint); 


      byte[] Bytes = Encoding.ASCII.GetBytes("0xFC\0xFC\0XFC"); 
      s.Send(Bytes); 

      byte[] buffer = new byte[50]; 
      s.Receive(buffer); 
      Console.WriteLine(Encoding.ASCII.GetString(buffer)); 
      Console.ReadKey(); 
     } 
    } 
} 

從代碼的輸出如下:

Establishing Connection to 192.168.10.101 
??↑?? ??#??'??$ 

所以我覺得我這裏有兩個核心問題:

1)如何檢測來自音頻設備的握手請求 2)如何發送適當的響應。

任何幫助將不勝感激。

UPDATE 1

byte[] buffer = new byte[1024]; 
int vari = s.Receive(buffer); 
string hex1 = vari.ToString("X"); 
Console.WriteLine(hex1); 

後連接hex1返回的15

UPDATE 2

Console.WriteLine("Sending Bytes"); 
byte[] Bytes1 = Encoding.ASCII.GetBytes("0xFF 0xFC 0x18 0xFF 0xFD 0x20 0xFF 0xFC 0x23 0xFF 0xFD 0x27 0xFF 0xFC 0x24 \n"); 
s.Send(Bytes1); 

的值,上面的代碼我尋找從下一個響應之後該服務器通過使用以下代碼,

byte[] buffer2 = new byte[1024]; 
int byteCount2 = s.Receive(buffer2); 
Console.WriteLine(byteCount2 + " Bytes Found"); 

所有我在控制檯看到的是那句「發送字節數」,這樣看來,Bytes1沒有被髮送,也沒有進一步的迴應讀取字節。

+2

提示:取一個調試器並檢查字節數組是否包含您期望的字節。提示#2:總是帶一個調試器,並檢查每個變量在程序執行時的每個時間點都有預期的值。 – zerkms

+0

@zerkms - 所以我附加了一個調試器,發現原始文章中更新1中記錄的值,_if_存儲在'hex1'(hex/int 15)中的響應F等於0xFF,那麼看起來我在右邊在考慮以下[鏈接](https://support.biamp.com/Tesira/Control/Telnet_session_negotiation_in_Tesira)中的示例協商過程時跟蹤。我不確定這是否確實是正確的,或者我的邏輯是否有缺陷? – Majickal

+2

我相信's.Receive'會返回接收到的請求的*長度*。所以'15'是接收了多少個字節。 – zerkms

回答

0

所以我覺得我這裏有兩個核心問題:

1)如何檢測從音頻設備
2)如何發送適當的響應握手請求。

1)如何從音頻設備

byte[] buffer = new byte[1024]; 
int byteCount = s.Receive(buffer); 
Console.WriteLine(byteCount + " Bytes Found"); 
DumpBytes(buffer, byteCount); 

DumpBytes(buffer, byteCount);功能上MSDN發現檢測握手請求:link 顯示在控制檯窗口buffer的內容,這是用於檢查有用一旦連接,telnet服務器的響應。

2)如何發送適當的響應(回到telnet服務器)。

var handshake1 = new byte[] { 0xFF, 0xFC, 0x18, 0xFF, 0xFC, 0x20, 0xFF, 0xFC, 0x23, 0xFF, 0xFC, 0x27, 0xFF, 0xFC, 0x24 }; 
s.Send(handshake1);