Я использую следующий код для выполнения подключения к сокету tcp и отправки строки в IP. Но иногда в ответ, я не получаю весь файлTCP Socket получает только часть сообщения
Socket m_socClient;
IPSelected ="1.1.2.3"
Port = "80"
string query ="My Query"
m_socClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
System.Net.IPAddress remoteIPAddress = System.Net.IPAddress.Parse(IPSelected);
System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(remoteIPAddress, Port);
m_socClient.Connect(remoteEndPoint);
try
{
if (m_socClient.Connected)
{
var reQuestToSend = "";
reQuestToSend = string.Format("POST /TMHP/Request HTTP/1.1\r\nHost:{0}\r\nContent-Length:{1}\r\n\r\n{2}", "edi-webtest.tmhp.com", Query270.Length, Query270);
byte[] bytesToSend = Encoding.ASCII.GetBytes(reQuestToSend);
byteCount = m_socClient.Send(bytesToSend, SocketFlags.None);
byte[] bytesReceived = new byte[3000];
byteCount = m_socClient.Receive(bytesReceived, SocketFlags.None);
Response271 = Encoding.ASCII.GetString(bytesReceived);
}
}
catch (Exception ex)
{
EVCommon.Log(ex.Message);
}
finally
{
m_socClient.Disconnect(false);
m_socClient.Close(5000);
}
Я думаю, что проблема с Byte [] bytesReceived = новый байт [3000]; Есть ли способ не кодировать это число 3000. Он работает большую часть времени, но для более длинных строк он получает только половину. Я хочу, чтобы он обрабатывал сообщения с переменным размером вместо задания размера байта до 30000 Спасибо
Где код, который читает сокет? Вам нужно будет продолжать чтение до тех пор, пока сервер не закроет соединение, или вы не получите последний фрагмент, или не прочитайте байты, обозначенные заголовком Content-length, или ... используйте библиотеку HTTP, такую как WebClient или HttpClient. – CodeCaster
У меня нет доступа к серверному коду. Я уверен, что они получают всю строку. Поскольку до тех пор, пока они не получат полную строку, которая проходит проверку на своем конце, они не отвечают другой строкой. Проблема не в чтении. Его проблема с получением ответа – user575219
Как @CodeCaster говорит - где код для чтения из сокета в arrayBeceived? –