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