Click here to Skip to main content
15,900,110 members
Home / Discussions / C / C++ / MFC
   

C / C++ / MFC

 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer0131-Jan-12 6:27
SledgeHammer0131-Jan-12 6:27 
GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt31-Jan-12 6:43
professionalJochen Arndt31-Jan-12 6:43 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer0131-Jan-12 6:58
SledgeHammer0131-Jan-12 6:58 
GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt31-Jan-12 7:14
professionalJochen Arndt31-Jan-12 7:14 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer0131-Jan-12 7:19
SledgeHammer0131-Jan-12 7:19 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer0131-Jan-12 14:12
SledgeHammer0131-Jan-12 14:12 
GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt31-Jan-12 21:25
professionalJochen Arndt31-Jan-12 21:25 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 6:52
SledgeHammer011-Feb-12 6:52 
I think that is what I'm doing Smile | :) ... I am using the network notifications w/ IOCP though. So in my start up I do:

C++
m_hIOCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);

when I create the socket, I do:

C++
SOCKET socket = WSASocket(pAddrInfo->ai_family, pAddrInfo->ai_socktype, 0, NULL, 0, WSA_FLAG_OVERLAPPED);

if (bind(socket, pAddrInfo->ai_addr, pAddrInfo->ai_addrlen) == SOCKET_ERROR)
{
...
}

CreateIoCompletionPort((HANDLE)socket, m_hIOCompletionPort, (DWORD)pClientContext, 0);

// I have 8 worker threads in this case, post initial recv

for (int nIndex = 0; nIndex < m_nThreadCount; nIndex++)
{
	SOCKADDR_STORAGE addr;

	addr.ss_family = AF_UNSPEC;
	addr.__ss_align = 0;

	int nAddrLen = sizeof(SOCKADDR_STORAGE);

	DWORD dwBytesSent = 0;
	DWORD dwFlags = 0;

	char szBuffer[MAX_BUFFER_SIZE];
	ZeroMemory(szBuffer, sizeof(szBuffer));

	WSABUF wsaBuf;

	wsaBuf.buf = szBuffer;
	wsaBuf.len = sizeof(szBuffer);

	OVERLAPPED overlapped;
	ZeroMemory(&overlapped, sizeof(OVERLAPPED));

	int nResult = ::WSARecvFrom(socket, &wsaBuf, 1, &dwBytesSent, &dwFlags, (sockaddr*)&addr,
							&nAddrLen, &overlapped, NULL);

	int nError = WSAGetLastError();

        // nResult = 1, nError = IO_PENDING which is ok since no data has arrived yet 
}

// create the 8 worker threads now


The worker thread func looks like:

C++
	while (WaitForSingleObject(m_hShutdownEvent, 0) != WAIT_OBJECT_0)
	{
		CClientContext* pClientContext = NULL;
		OVERLAPPED* pOverlapped = NULL;
		DWORD dwBytesTransferred = 0;
		DWORD dwFlags = 0;
		WSABUF* pWSABUF = NULL;

		BOOL bReturn = GetQueuedCompletionStatus(m_hIOCompletionPort, &dwBytesTransferred,
												 (LPDWORD)&pClientContext, &pOverlapped, INFINITE);

  // if it got here, I'm assuming the data is in the buffer and ready to go, no?

						SOCKADDR_STORAGE from;
						int nFromLen = sizeof(SOCKADDR_STORAGE);
						memset(&from, 0, sizeof(SOCKADDR_STORAGE));

						int nBytesRecv = -1;

							nBytesRecv = WSARecvFrom(pClientContext->GetSocket(), pWSABUF, 1, &dwBytesTransferred,
													&dwFlags, (sockaddr*)&from, &nFromLen, pOverlapped, NULL);
						


						int j = WSAGetLastError();
						int k = 0;


// PROBLEM is here!! nBytesRecv is still -1 and WSAGetLastError() is still 997 :(. It is my understanding that GetQueuedCompletionStatus() will block until buffer is ready? That is how it works on TCP at least.
						}

}

GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt1-Feb-12 7:35
professionalJochen Arndt1-Feb-12 7:35 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 7:53
SledgeHammer011-Feb-12 7:53 
GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt1-Feb-12 8:00
professionalJochen Arndt1-Feb-12 8:00 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 8:09
SledgeHammer011-Feb-12 8:09 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 8:19
SledgeHammer011-Feb-12 8:19 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 8:31
SledgeHammer011-Feb-12 8:31 
GeneralRe: basic Winsock / IOCP / UDP question Pin
SledgeHammer011-Feb-12 11:10
SledgeHammer011-Feb-12 11:10 
GeneralRe: basic Winsock / IOCP / UDP question Pin
Jochen Arndt1-Feb-12 21:04
professionalJochen Arndt1-Feb-12 21:04 
QuestionLINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12 Pin
KASR130-Jan-12 4:01
KASR130-Jan-12 4:01 
AnswerRe: LINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12 Pin
Chris Losinger30-Jan-12 4:37
professionalChris Losinger30-Jan-12 4:37 
GeneralRe: LINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12 Pin
KASR130-Jan-12 5:46
KASR130-Jan-12 5:46 
GeneralRe: LINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12 Pin
Chris Losinger30-Jan-12 5:51
professionalChris Losinger30-Jan-12 5:51 
GeneralRe: LINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12 Pin
KASR130-Jan-12 6:42
KASR130-Jan-12 6:42 
QuestionRe: LINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12 Pin
David Crow30-Jan-12 5:13
David Crow30-Jan-12 5:13 
GeneralRe: LINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12 Pin
KASR130-Jan-12 5:28
KASR130-Jan-12 5:28 
AnswerRe: LINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12 Pin
Stephen Hewitt31-Jan-12 3:22
Stephen Hewitt31-Jan-12 3:22 
QuestionHow to call load a dialog of an activeX control in a mfc application Pin
Adity Bhattacharya30-Jan-12 1:14
Adity Bhattacharya30-Jan-12 1:14 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.