Я создаю службу windows и клиент, и они общаются, думает, сокет.
Я добавляю receiveTimeout
в мой сокет 10000ms
, для моего первого запроса у меня нет проблем, у меня есть мой ошибка тайм-аута, но для моего второго запроса я получаю сообщение первого запроса.
Кто-то знает, как мне изменить свой код, чтобы он работал.
Клиент :
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("Enter a request: ");
string req = Console.ReadLine();
byte[] buffer = Encoding.ASCII.GetBytes(req);
_clientSocket.Send(buffer,0,buffer.Length,SocketFlags.None);
_clientSocket.ReceiveTimeout = 10000;
Console.WriteLine("RECEIVE TIMEOUT" + _clientSocket.ReceiveTimeout);
if (req != string.Empty)
{
try
{
var receivedBuffer = new byte[2048];
int rec = _clientSocket.Receive(receivedBuffer, SocketFlags.None);
byte[] data = new byte[rec];
Array.Copy(receivedBuffer, data, rec);
string result = Encoding.ASCII.GetString(data);
Console.WriteLine("Received : " + result);
}
catch (SocketException se)
{
if (se.SocketErrorCode == SocketError.TimedOut)
Console.WriteLine("TIMEOUT");
}
}
}
}
Сервер :
protected override void OnStart(string[] args)
{
try
{
Log.writeEventLog("Setting up server...");
_serverSocket.Bind(new IPEndPoint(IPAddress.Any, 100));
_serverSocket.Listen(1);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}catch(Exception ex)
{
Log.writeEventLog("SetupServer :" + ex.Message);
}
}
private static void AcceptCallback(IAsyncResult AR)
{
try
{
Socket socket = _serverSocket.EndAccept(AR);
_clientSockets.Add(socket);
Log.writeEventLog("Client connected");
socket.BeginReceive(_buffer,0,_buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveCallback),socket);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
catch (Exception ex)
{
Log.writeEventLog("AcceptCallback :" + ex.Message);
}
}
private static void ReceiveCallback(IAsyncResult AR)
{
Socket socket = (Socket)AR.AsyncState;
try
{
int received = socket.EndReceive(AR);
byte[] dataBuf = new byte[received];
Array.Copy(_buffer,dataBuf,received);
string text = Encoding.ASCII.GetString(dataBuf);
Log.writeEventLog("TEXT RECEIVED: " + text);
string response = string.Empty;
if(text.ToLower().Contains("0_"))
{
System.Threading.Thread.Sleep(10500);
response = "Check";
}
else if (text.ToLower().Contains("1_"))
{
System.Threading.Thread.Sleep(10500);
response = "Refresh" ;
}
else
{
System.Threading.Thread.Sleep(10500);
response = "Invalid Request";
}
byte[] data = Encoding.ASCII.GetBytes(response);
socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallBack), socket);
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket);
}
catch(Exception ex)
{
Log.writeEventLog("client disconnected");
socket.Close();
socket.Dispose();
}
}
private static void SendCallBack(IAsyncResult AR)
{
try
{
Socket socket = (Socket)AR.AsyncState;
socket.EndSend(AR);
}
catch (Exception ex)
{
Log.writeEventLog("sendcallback :" + ex.Message);
}
}
Например, мой запрос:
запрос 1: 0_test
-> после 10000мс I есть ответ TIMEOUT
запрос 2: t
-> через 10000 мс У меня есть ответ Check
Для проверки receiveTimeout
Я использую Thread.Sleep(10500)