Сокеты. Отправка сообщения.

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
THuND3Rb0LT
Сообщения: 22
Зарегистрирован: 16 авг 2009, 13:02
Откуда: Dnepropetrovsk
Контактная информация:

Доброго времени суток, господа и дамы.
Столкнулся с такой проблемой.

Код: Выделить всё

void CChatDlg::OnBnClickedButton3()
{
	int iLen;
	int iSent;
	UpdateData(TRUE);
	if (m_strMessage != "")
	{
		iLen = m_strMessage.GetLength();
		iSent = m_sConnectSocket.Send(m_strMessage,iLen); //?!!!!
		if(iSent == SOCKET_ERROR)
		{
		}
		else
		{
			m_ctlSent.AddString(m_strMessage);
			UpdateData(FALSE);
		}
	}
}
void CChatDlg::OnReceive()
{
	char *pBuf = new char[1025];
	int iBufSize = 1024;
	int iRcvd;
	CString strRecvd;
	iRcvd = m_sConnectSocket.Receive(pBuf, iBufSize);
	if(iRcvd == SOCKET_ERROR)
	{
	}
	else
	{
		pBuf[iRcvd]=NULL;
		strRecvd = pBuf;
		m_ctlRecvd.AddString(strRecvd);
		UpdateData(FALSE);
	}
}
При нажатии на кнопку "Send" из CEdit'a должно браться сообщение и отправляться на "другую сторону". Проблема в том, что отправляется только первый введенный символ, вся остальная часть сообщения обрезается. Если же вот здесь

Код: Выделить всё

m_sConnectSocket.Send(m_strMessage,iLen)
заменить m_strMessage на любую, например "jdsfndsifnsdogfn" строку, то эта строка отправляется и получается абсолютно нормально.
Помогите разобраться, пожалуйста!

P.s. компилятор Visual Studio 2010 SP1
P.p.s. когда-то писал это на Visual Studio 6 и там все отлично работало.
THuND3Rb0LT
Сообщения: 22
Зарегистрирован: 16 авг 2009, 13:02
Откуда: Dnepropetrovsk
Контактная информация:

Проблема отправки и получения сообщения решена.
Проблема теперь в корректности сообщения.
Доходит только половина сообщения.

Код: Выделить всё

int iRcvd;
iRcvd = m_sConnectSocket.Receive(pBuf, iBufSize);
THuND3Rb0LT
Сообщения: 22
Зарегистрирован: 16 авг 2009, 13:02
Откуда: Dnepropetrovsk
Контактная информация:

Проблема решена не слишком экономным, но тем не менее способом.

Код: Выделить всё

      iLen = m_strMessage.GetLength();
		CString msg = LPCTSTR(m_strMessage.GetBuffer());
		msg += '\0';
		MessageBox(msg);
		iSent = m_sConnectSocket.Send(msg,iLen*2);

Код: Выделить всё

TCHAR *pBuf = new TCHAR[1025];
	int iBufSize = 1024;
	__int64 iRcvd;
	CString strRecvd;
	iRcvd = m_sConnectSocket.Receive(pBuf, iBufSize);
Но я все еще надеюсь, что мне подскажут другой способ решения, так как исходящее сообщение нужно шифровать, и мое решения для шифрования не подойдет.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Очень похоже на то, что у тебя уникодная сборка проекта. Проверь дефайн _UNICODE в свойствах проекта - скорее всего он определён.

В уникодной сборке каждый символ представлен двумя байтами, а не одним, поэтому строка состоящая, скажем из двух уникодных символов будет иметь общую длину 4 байта. Так как метод Send принимает в качестве второго параметра именно количество байт, а не длину строки, то мы ожидаемо передаём лишь половину всем символов. Правильной будет следующая запись (она будет работать одинаково правильно и для уникодной, и для неуникодной сборки без изменения кода):

Код: Выделить всё

m_sConnectSocket.Send(m_strMessage.GetBuffer(), m_strMessage.GetLength()*sizeof(TCHAR));
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить