Sar Kerson Ответов: 1

Приложение MFC, которое использует сокет, кажется странным


Вот функция приема сообщений серверного приложения:
void CServerDlg::ReceiveData(CSocket & socket)
{
	char bufferdata[BUFFERSIZE];						
	int len = socket.Receive(bufferdata,BUFFERSIZE);	
	if (len != -1)								
	{
		bufferdata[len] = '\0';							
		POSITION pos = m_socketlist.GetHeadPosition();	
		std::cout << len ;
		std::cout << "got";
		std::cout << bufferdata << '\n';
		while (pos != NULL)							
		{
			CClientSocket* socket = (CClientSocket*)m_socketlist.GetNext(pos);
			if (socket != NULL) {						
				socket->Send(bufferdata, len);		
			}
		}
	}

}

Я просто хочу напечатать текст, который он получает из клиентского приложения в окне консоли, но он не показывает текст, а просто правильный номер LEN и "got".
Но что меня смущает, так это то, что клиентское приложение получает текст правильно!!Как это странно!!!!

Что я уже пробовал:

Я пытался поставить
[std:: cout << len ;
std:: cout << " got";
std:: cout < & lt; bufferdata << '\n';]
под while {...}, чтобы избежать случая, когда он не получил текст полностью, но проблема все еще существует. Пожалуйста, скажите мне, как я могу это сделать?

[no name]

Что находится в bufferdata? Если вы не знаете, то пришло время научиться использовать отладчик.

Sar Kerson

Я только что попробовал. То, что находится в bufferdata, на самом деле совпадает с тем, что он печатает в окне консоли. Но почему он может правильно передать текст?

Richard MacCutchan

Каково точное содержимое буфера? Является ли первый байт допустимым символом?

Sar Kerson

В моем примере я отправил "QWE "из клиентского приложения, но серверное приложение напечатало" Q " в окне консоли. Однако он передает "QWE" клиентскому приложению. Я так запуталась. Что ж, я попробую еще раз.

Richard MacCutchan

Похоже, что вы передаете символы Юникода, поэтому второй байт данных является нулевым символом. Когда вы вызываете cout, он пытается напечатать символы как ASCII и останавливается на первом null. Просмотр данных с помощью вашего отладчика немедленно подтвердит это.

Sar Kerson

Да, вы правы!!!!! Наконец я меняю "char bufferdata []" на "wchar_t bufferdata []", и это работает! Большое вам спасибо за совет.

1 Ответов

Рейтинг:
4

CPallini

Простой и эффективный способ увидеть фактические данные - это использование отладчика.
Другим подходом может быть отображение шестнадцатеричного представления каждого принятого байта.