Страница 1 из 1

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

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

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

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 и там все отлично работало.

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

Добавлено: 27 апр 2014, 15:52
THuND3Rb0LT
Проблема отправки и получения сообщения решена.
Проблема теперь в корректности сообщения.
Доходит только половина сообщения.

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

int iRcvd;
iRcvd = m_sConnectSocket.Receive(pBuf, iBufSize);

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

Добавлено: 27 апр 2014, 16:09
THuND3Rb0LT
Проблема решена не слишком экономным, но тем не менее способом.

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

      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);
Но я все еще надеюсь, что мне подскажут другой способ решения, так как исходящее сообщение нужно шифровать, и мое решения для шифрования не подойдет.

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

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

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

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

m_sConnectSocket.Send(m_strMessage.GetBuffer(), m_strMessage.GetLength()*sizeof(TCHAR));