標準の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
}
}
}