Проблема в получении данных сокета TCP / IP в C # - PullRequest
0 голосов
/ 23 сентября 2010

Я получаю 3144 байта данных через сокет TCP / IP в режиме отладки, но в исключение было получено 1023 байта.Почему оставшиеся данные не читаются?

IPEndPoint ipEnd = new IPEndPoint(ipAdd, ipPort);
Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
soc.Connect(ipEnd);
byte[] sendData = Encoding.ASCII.GetBytes("msg");
soc.Send(sendData);
int byteLen = 4*1024;
byte[] RecData = new byte[byteLen];
int DataLen = soc.Receive(RecData, 0, RecData.Length, SocketFlags.None);// Here I placed breakpoint

string str = Encoding.ASCII.GetString(RecData, 0, DataLen);
MessageBox.WriteLine(str);
soc.Close();

При пошаговой отладке я получаю DataLen как 3144 байта, и он работает правильно.Однако во время исключения я получаю DataLen как 1023 байта.Почему это происходит?Мне нужно напечатать полученные данные str в формате MessageBox или TextBox.

Ответы [ 2 ]

3 голосов
/ 23 сентября 2010

Похоже, вы предполагаете, что получите все данные за один Receive вызов. TCP / IP является потоковым протоколом - вы не должны делать это предположение.

Вам необходимо выполнить цикл, читая столько данных, сколько необходимо. В идеале ваш протокол должен указывать вам, как читать данные как часть каждого «сообщения» (или какова бы ни была ваша эквивалентная концепция), или закрывать сокет, когда он заканчивает писать. В любой из этих ситуаций вы узнаете, когда прочитаете все. Альтернативой является включение разделителя, что означает, что вы все равно будете знать, когда прочитали полное «сообщение», но вы также потенциально прочитаете начало следующего сообщения.

1 голос
/ 23 сентября 2010

Вы должны получать части данных в цикле, пока не получите все это.
Посмотрите код ниже:

void Receive(Socket socket, byte[] buffer, int offset, int size)
{
  int received = 0;  
  do {
    try {
      received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None);
    }
  } while (received < size);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...