Member 14499788 Ответов: 1

Как проверить, прибыл новый udp-пакет или нет?


Привет Всем,



У меня есть программа, которая может непрерывно получать udp-пакеты с сервера,
но как я могу проверить, что новый пакет получен ufrom с сервера?

Свою программу для приема udp-пакета я написал ниже.


если у кого-то есть идея по этому поводу , пожалуйста, поделитесь ею!
Спасибо в addvance


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

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

Класс сокета TCP
файл .cpp

void UdpReceivingSocket::OnReceive(int nErrorCode)
{
nRead = Receive(buff, 4096); 
	icount1++;

	switch (nRead)
	{
	case 0:       // Connection was closed.
		Close();
		break;
	case SOCKET_ERROR:
		if (GetLastError() != WSAEWOULDBLOCK)
		{
			AfxMessageBox(L"Error occurred");
			Close();
		}
		break;

	default: // Normal case: Receive() returned the # of bytes received.
		
		buff[nRead] = 0;

CAsyncSocket::OnReceive(nErrorCode);
}

.h file
#pragma once
#include <afxsock.h>

#include "FILE_TRIALDlg.h"
# include "TcpSendSocket.h"


class UdpReceivingSocket :
	public CAsyncSocket
{
	
	void OnReceive(int nErrorCode);
public:

	UdpReceivingSocket();
	~UdpReceivingSocket();
	BYTE buff[4096];
	int nRead;

};

0x01AA

Например, в OnReceive вы можете отправить сообщение windows в определенное (возможно, скрытое) окно. В случае, если вы это сделаете, обязательно используйте PostMessage и никогда_ SendMessage

Richard MacCutchan

Что ты имеешь в виду как я могу проверить"? Вы получаете уведомление в функции OnReceive. Но чтобы узнать, какая часть сообщения отправителя получена, вам нужно установить протокол обмена сообщениями между сервером и клиентом, чтобы каждый конец знал, когда получено новое сообщение. Например, добавление заголовка сообщения, который дает длину сообщения, сообщает получателю, сколько байтов нужно принять для полного сообщения.

KarstenK

udp немного ненадежен, потому что его соединение не имеет состояния. Рассмотрите возможность использования tcp.

Member 14499788

Проблема решена!!!
Я использовал счетчик для класса сокетов.

Спасибо всем за предложения!
Я действительно ценю всех вас здесь за помощь таким людям, как мы, которые являются новичками.
Отличная работа!!
овации

1 Ответов

Рейтинг:
0

Rick York

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

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