Наш офис в настоящее время использует telnet для запроса внешнего сервера. Процедура примерно такая.
- Соединение - телнет открыт 128 ........ 25000
- Запрос - мы вставляем запрос и затем нажимаем alt + 019
- Ответ - Мы получаем ответ в виде текста в окне telnet
Так что я пытаюсь сделать эти запросы автоматически, используя приложение c #. Мой код следующий
Сначала соединение. (Без исключений)
SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
String szIPSelected = txtIPAddress.Text;
String szPort = txtPort.Text;
int alPort = System.Convert.ToInt16(szPort, 10);
System.Net.IPAddress remoteIPAddress = System.Net.IPAddress.Parse(szIPSelected);
System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(remoteIPAddress, alPort);
SocketClient.Connect(remoteEndPoint);
Затем я отправляю запрос (без исключений)
string data ="some query";
byte[] byData = System.Text.Encoding.ASCII.GetBytes(data);
SocketClient.Send(byData);
Тогда я пытаюсь получить ответ
byte[] buffer = new byte[10];
Receive(SocketClient, buffer, 0, buffer.Length, 10000);
string str = Encoding.ASCII.GetString(buffer, 0, buffer.Length);
txtDataRx.Text = str;
public static void Receive(Socket socket, byte[] buffer, int offset, int size, int timeout)
{
int startTickCount = Environment.TickCount;
int received = 0; // how many bytes is already received
do
{
if (Environment.TickCount > startTickCount + timeout)
throw new Exception("Timeout.");
try
{
received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None);
}
catch (SocketException ex)
{
if (ex.SocketErrorCode == SocketError.WouldBlock ||
ex.SocketErrorCode == SocketError.IOPending ||
ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
{
// socket buffer is probably empty, wait and try again
Thread.Sleep(30);
}
else
throw ex; // any serious error occurr
}
} while (received < size);
}
Каждый раз, когда я пытаюсь получить ответ, я получаю «существующее соединение принудительно закрыто удаленным хостом», если открыть telnet и отправить тот же запрос, я сразу получаю ответ
Есть идеи или предложения?