2009-03-09 13 views
0

標準の0x0ではなく0x4で応答を終了するサーバにtcp経由で接続する必要があります。私は物事をシンプルにして、ソケットクラスからの同期送受信を使用したいと思います。サーバーは0x0でメッセージを終了しないため、sendは動作しますが受信ブロックは無期限にブロックされます。最初の0x4に同期して読み込むことはできません。なぜなら、より多くのメッセージを送信するために接続を開いたままにする必要があるからです。 BeginReceiveを使用して別のスレッドでデータを読み取るだけで、まだ0x0ターミネータが必要なように見えるのは素晴らしいことです。私はBeginRecieveにサイズ1のバッファを渡そうとしましたが、それは各charの読み込みに対してデリゲートを呼び出すことを望んでいましたが、そのようには動作しません。最初のcharを読み込んで停止します。ソケットを特殊なメッセージターミネータと非同期に読み取る

すべてのアイデア?

ここでアプリが

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 
     } 
    } 
} 

答えて

2

だ0x04を持つ終端が怪しげなようだが、あなたのコードが1バイトの後に停止している理由は、あなたが1バイトのみを求めたということです。 2番目のバイトが必要な場合は、もう一度尋ねる必要があります。

あなたが0x04のを打つまで、次のようにByteReceivedあなたを変更すると、あなたのすべてのバイトを取得する必要があります。

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); 
    } 
} 

HTTP応答を読み込むための典型的な方法は、あなたがヘッダーのターミネータを打つまでのバイトを読み取ることで、 httpヘッダーのcontent lengthフィールドを使用して、読み込み済みのバイト数を調べます。

再び0x04終了は不審なようです。

関連する問題