Как получить непрерывный 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-пакета