Сокет tcp c # как очистить входной буфер?
Я пишу приложение для Windows Phone, и мне нужно общаться с сервером и передавать данные. СЕРВЕР написан на C ++, и я не могу его изменить. КЛИЕНТ - это то, что я должен написать. Сервер спроектирован так, что клиент подключается к нему и передает данные. Соединение остается открытым для всей передачи. Записав свой код на C #, я могу получать данные с сервера, но после первого получения данные, которые я читаю в буфере, всегда одинаковы. Поэтому мне нужен способ очистить входной буфер, чтобы я мог получать новые данные (данные отправляются непрерывно). Я'используя класс, определенный здесь:
http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202858%28v=vs.105%29.aspx
большое спасибо !!
Я использовал этот код для получения в SocketClient.cs:
public string Receive()
{
string response = "Operation Timeout";
// We are receiving over an established socket connection
if (_socket != null)
{
// Create SocketAsyncEventArgs context object
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
// Setup the buffer to receive the data
socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
// Inline event handler for the Completed event.
// Note: This even handler was implemented inline in order to make
// this method self-contained.
socketEventArg.Completed += new EventHandler(delegate(object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
// *********************************************
// THIS part of the code was added to receive
// a vector of 3 double
Double[] OdomD = new Double[3];
for (int i = 0; i < 3; i++)
{
OdomD[i] = BitConverter.ToDouble(e.Buffer, 8 * i);
}
// *********************************************
}
else
{
response = e.SocketError.ToString();
}
_clientDone.Set();
});
// Sets the state of the event to nonsignaled, causing threads to block
_clientDone.Reset();
// Make an asynchronous Receive request over the socket
_socket.ReceiveAsync(socketEventArg);
// Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
// If no response comes back within this time then proceed
_clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
else
{
response = "Socket is not initialized";
}
return response;
}
Метод Connect () точно такой же, как описано в ссылке выше. Поэтому при запуске приложения метод Connect () вызывается следующим образом:
SocketClient client = new SocketClient();
// Attempt to connect to server for receiving data
Log(String.Format("Connecting to server '{0}' over port {1} (data) ...", txtRemoteHost.Text, 4444), true);
result = client.Connect(txtRemoteHost.Text, 4444);
Log(result, false);
Это делается только один раз в начале, затем мне нужно получить этот массив из 3 двойных, который обновляется каждую секунду. Поэтому я использую:
Log("Requesting Receive ...", true);
result = client.Receive();
Log(result, false);
Проблема в том, что также, если я отлаживаю код и останавливаю выполнение внутри Receive (), я всегда читаю одно и то же значение, то есть первое значение, отправленное сервером. Что я'Я ожидаю, что каждый раз, когда я вызываю client.Receive (), я получаю новое значение, но это не происходит.
У меня была похожая проблема, когда я писал тот же клиент в среде Matlab. Я решил проблему с помощью функции flushinput (t), прежде чем читать входной буфер. Таким образом, я всегда мог прочитать последние данные, отправленные сервером. Я'я ищу функцию, похожую на эту ..
Размер входного буфера фиксируется равным данным, которые яm ожидает получения, в этом случае 24 байта (3 * sizeof (double)) ..
Большое спасибо за ваше время!