Re: Please Help!!! - CAsyncSocket::OnReceive Not Working for
Microsoft UDP Application (msocudp)
On May 16, 4:23 pm, "Scott McPhillips [MVP]" <org-dot-mvps-at-
scottmcp> wrote:
"Roshan" <ros...@exeltech.com> wrote in message
news:423fa9ba-0d3e-460b-9313-fde38f931b30@24g2000hsh.googlegroups.com...
Scott,
Thank you so much for the response and info. I really appreciate it.
The packet sniffer is an application itself, correct? Therefore, if it
can fetch and read all the packets, then
should it not be true that a VC++ application () do the same?
No. I've seen the same problem with sniffer + my application. Speed
(actually, latency) is critical in the application. In your receiving thre=
ad
get the packet, do the least possible amount of work to save it, then retu=
rn
from OnReceive. It works better if the receiving thread is set to high
priority, and it works better if you turn off Window's fancy painting (i.e=
..
try "classic" appearance options, etc.).
(A) The sniffer probably uses a custom device driver.
(B) The sniffer is probably written by an expert.
--
Scott McPhillips [VC++ MVP]
Scott,
Hello. Hope you're weekend went well. I am now trying threading with
UDP sockets. On my first try it seems
the OnReceive() is not getting invoked when sending a packet in a
thread.
Please let me know what I might be doing wrong here.
Snippets of my code:
(*** MICROSOFT'S UDP APP CODE - OnReceive() ***)
void CProdTestUdpSk::OnReceive(int nErrorCode)
{
OutputDebugString("CProdTestUdpSk::OnReceive\n");
TCHAR buff[70000];
int nRead;
CString pktType, pktSeq, pktNum, ipAddress, rawData, dvString,
byteString, hexString;
long decimalVal;
ipAddress = ((CProdTestDlg*)m_pDlg)->m_destIPAddress;
UINT TEMP_PORT = DEST_PORT;
nRead = ReceiveFrom(buff, 69999, ipAddress, TEMP_PORT); //make it
smaller so we can experiment multiple notifications
...
packetCounter++;
if (packetCounter == 10)
SetEvent(m_hRcvEvent); // (*** SET RECEIVE
EVENT TO NOTIFY WORKER THREAD
TO
CONTINUE SINCE ALL 10 PACKETS ARE NOW RECEIVED ***)
...
}
(*** THE WORKER THREAD ***)
UINT UDPSocketThread(LPVOID pParam)
{
PRODTESTINFO *ptinfo = (PRODTESTINFO *) pParam;
CProdTestUdpSk *pUDPSocket = ptinfo->pUDPSocket;
HANDLE *pEvent = ptinfo->pEvent;
pUDPSocket->m_nBytesSent = 0;
pUDPSocket->m_sendBuffer = ptinfo->sendString;
pUDPSocket->m_nBytesBufferSize = ptinfo->sendString.GetLength() + 1;
pUDPSocket->DoAsyncSendBuff(); (*** WE ARE SENDING THE PACKET
WITH THIS STATEMENT ***)
if (pUDPSocket->m_sequenceNumber == 255)
pUDPSocket->m_sequenceNumber = 0;
else
pUDPSocket->m_sequenceNumber++;
Sleep(ptinfo->delay);
WaitForSingleObject(pUDPSocket->m_hRcvEvent, INFINITE); // WAIT FOR
RECEIVE EVENT
SetEvent(*pEvent); // (*** SET COMPLETION EVENT TO NOTIFY MAIN
THREAD TO CONTINUE ***)
delete ptinfo;
return 0;
}
(*** THE MAIN APPLICATION THREAD - GUI ***)
...
void CProdTestDlg::UnsetRelays(int hexNum)
{
CString sendString, verString = "01", seqString, twoByteHexAddInfo;
m_cmdString = "02";
twoByteHexAddInfo.Format("%04x", hexNum);
seqString.Format("%02x", m_pUDPSocket->m_sequenceNumber);
sendString = verString + seqString + m_cmdString + twoByteHexAddInfo;
// *** Must pass in an allocated param object to AfxBeginThread() ***
pti = new PRODTESTINFO();
pti->pUDPSocket = m_pUDPSocket;
pti->sendString = sendString;
pti->delay = 10;
pti->pEvent = &m_hFinishEvent;
AfxBeginThread(UDPSocketThread, pti);
WaitForSingleObject(m_hFinishEvent, INFINITE); // WAIT FOR
COMPLETION EVENT
}
...