2009-03-09 19 views
0

Standart 0x0 yerine 0x4 ile yanıtları sonlandıran bir sunucuya tcp ile bağlanmam gerekiyor. İşleri basit tutmak ve soket sınıfından senkronize bir gönderme/alma kullanmak istiyorum. Gönderme, ancak sunucuların 0x0 ile iletileri sonlandırması nedeniyle süresiz olarak blokları çalışır. Senkronize olarak ilk 0x4'e okuyamıyorum ve daha fazla ileti göndermek için bağlantıyı açık tutmam gerektiğinden kapatılamıyor. BeginReceive kullanarak ayrı bir iş parçacığı üzerinde veri okuyabiliyor olsaydım, ancak hala 0x0 sonlandırıcısına ihtiyaç duyuyor gibi görünüyorsa harika olurdu. BeginRecieve'e, her bir char okuması için delegimi çağıracağını umuyordum ama bu şekilde çalışmadığı görülüyordu. İlk karakteri okur ve durur.Özel ileti sonlandırıcı ile eşzamansız olarak veri okuma

Herhangi bir Fikir?

Burada 0x04 sonlandırma şüpheli görünüyor uygulaması

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Net; 
using System.Net.Sockets; 


namespace SocketTest 
{ 
    public partial class SocketTestForm : Form 
    { 
     Socket socket; 
     byte[] oneChar = new byte[1]; 

     public SocketTestForm() 
     { 
      InitializeComponent(); 
     } 

     private void GetButton_Click(object sender, EventArgs e) 
     { 
      //connect to google 
      IPHostEntry host = Dns.GetHostEntry("google.com"); 
      IPEndPoint ipe = new IPEndPoint(host.AddressList[0], 80); 
      socket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
      socket.Connect(ipe); 
      if(socket.Connected) 
       Console.WriteLine("Connected"); 

      //write an http get header 

      String request = "GET/HTTP/1.1\r\nHost: google.com\r\nConnection: Close\r\n\r\n"; 

      socket.Send(Encoding.ASCII.GetBytes(request)); 

      //read the response syncronously, the easy way... 
      //but this does not work if the server does not return the 0 byte... 

      //byte[] response = new byte[5000]; 
      //socket.Receive(response, response.Length, SocketFlags.None); 
      //string res = Encoding.ASCII.GetString(response); 
      //Console.WriteLine(res); 

      //read the response async 
      AsyncCallback onreceive = ByteReceived; 
      socket.BeginReceive(oneChar, 0, 1, SocketFlags.None, onreceive, null); 
     } 

     public void ByteReceived(IAsyncResult ar) 
     { 
      string res = Encoding.ASCII.GetString(oneChar); 
      if (res[0] == 0x4) ; //fire some event 
     } 
    } 
} 

cevap

2

, ama kodunuzu bir bayt sonra duruyor nedeni, yalnızca bir bayt istedi olmasıdır. İkinci bir bayt istiyorsan tekrar sormalısın.

değiştirme senin ByteReceived Bir 0x04 çarpana kadar size tüm bayt kalkmak gerektiğini şöyle: http yanıtı Üstbilgiye için terminatör çarpana kadar bayt okumaktır okumak için

public void ByteReceived(IAsyncResult ar) 
{ 
    string res = Encoding.ASCII.GetString(oneChar); 
    if (res[0] == 0x4) 
    { 
     //fire some event 
    } 
    else 
    { 
     AsyncCallback onreceive = ByteReceived; 
     socket.BeginReceive(oneChar, 0, 1, SocketFlags.None, onreceive, null); 
    } 
} 

tipik bir şekilde, daha sonra okuyacağınız kaç bayt olduğunu öğrenmek için http başlığındaki içerik uzunluğu alanını kullanın.

Yine 0x04 sonlandırma şüpheli görünüyor.

İlgili konular