Member 14499788 Ответов: 1

Как получить непрерывный UDP-пакет данных с сервера?


Алло ради я новичок в сетевом программировании.
Может ли кто - нибудь помочь мне найти решение этой проблемы?
Я хотел бы получать непрерывные пакеты данных со стороны сервера, но я всегда застрял с функциями assert в программе.
Поэтому за один раз я получаю только один пакет данных,
Я сделал это с помощью многопоточного процесса.
Я не в состоянии распознать ошибку


Ваше здоровье!

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

iLen = m_clientSocket.Receive(pBuf, 1024); //Receieve Data packet
	if (iLen == SOCKET_ERROR)
	{
		AfxMessageBox(L"Could not Recieve");
		return;
			}
			else
			{
				
				/*if (iLen == sizeof(struct udp_tackpacket_t))
				{
					struct udp_tackpacket_t* pstrFrame;
					pstrFrame = (struct udp_tackpacket_t*)pBuf;

					m_sharedData.szCounter.Format(_T("%d"), pstrFrame->header.counter);

				}*/

				pBuf[iLen] = NULL;
				strData = pBuf;
		m_data.Insert(m_data.GetLength(), strData);   //display in server
		UpdateData(FALSE);
		//int strdatalength = iLen;;
		//m_clientSocket.Send(strData, iLen);
		//UpdateData(FALSE)

Richard MacCutchan

Вы не можете гарантировать получение UDP-сообщений, поскольку они похожи на широковещательные передачи. Они отправляются сервером, но никаких проверок не производится, чтобы гарантировать либо успешную доставку, либо отправку в правильном порядке.

Если вы загуглите "образец сокета", то найдете множество примеров того, как это сделать правильно.

Member 14499788

Да , спасибо за предложение!
Я пробовал делать это многими способами из интернета.Главная проблема заключается в том, что я не могу получить непрерывный udp-пакет. Программа останавливается после получения одного пакета данных

Richard MacCutchan

По мере получения каждого сообщения вы добавляете данные в текущий буфер приема и проверяете его, чтобы увидеть, где начинается и заканчивается сообщение сервера. Единственная проблема заключается в том, что UDP-пакеты не гарантируются и могут даже поступать в неправильном порядке, поэтому управлять ими становится довольно трудно.

Member 14499788

Спасибо!!

CPallini

Почему он останавливается? Какое утверждение терпит неудачу? Пожалуйста, дайте более подробную информацию.

Member 14499788

m_clientSocket.Create(7000, SOCK_DGRAM, FD_READ, NULL);
если (m_clientSocket.Подключение(L"172.16.2.91", m_UDP_Port))
{
AfxMessageBox(L"Соединение Успешно Выполнено");
вернуть;
}
еще
{
AfxMessageBox(L"Ошибка Подключения");
}
Типа DWORD ошибка = код последней ошибки();
Это код до этого,
Утверждать функция показывает сообщение об ошибке рядом с создавать и отправлять функции в программе

CPallini

Почему вы создаете сокет для каждой дейтаграммы?

Member 14499788

я создал только один объект сокета

CPallini

Опубликованный код вызывает метод Create. Ты жалуешься, что это не удается
при выполнении во второй раз...

Member 14499788

Да это проблема но я не в состоянии понять ее

Member 14499788

В моем проекте я хотел бы измерить непрерывную форму данных UDP-пакета

1 Ответов

Рейтинг:
12

CPallini

Взгляните на эти примеры кода: Сокетов MFC [^].
Также взгляните на эту статью CodePrject: Отправка и получение UDP-дейтаграмм с помощью класса CAsyncSocket C++ MFC[^].


Member 14499788

Хай CPallini
Спасибо за предложение.
моя программа работает отлично:):)

CPallini

Добро пожаловать.