I'm messing around with TCP programming using iocps (XP Pro)
If multiple iocp-worker threads are used, how data-corruption can be
avoided.
Example:
- Thread #1 WSASends a block of data.
This send could not completely be done by winsock, so the completion
notification comes back with according byte counts, (bytes_sended <
bytes_to_be_sended).
Thread #1 tries to WSASend the rest of the data-block
- just before issuing the WSASend, Thread #1 is preempted by Thread #2
Thread #2 WSASends another block of data.
Here data corruption may/will occur.
In such a scenario (it is never guaranteed that winsock is able to send
all data of a WSASend-Call, the app may be required to re-send the rest)
how can multiple threads work properly?
My understanding is that if I issue only ONE WSASend on one socket, data
integrity can be guaranteed.
This implies that multiple sends issued from multiple threads to one
socket does not make sense. Multiple sends from one thread would be ok.
But then there is no advantage using multiple threads...
On a side note, WSASend will never return with a partial
success - it's all or nothing. This doesn't even make sense
for overlapped I/O though, since your send is not completed
yet. It's the completion notification that's all or nothing. But,
if you do get a partial completion, that means all subsequent
sends will complete with failure (the socket is toast).
--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnic...@mvps.org
MVP VC FAQ: http://vcfaq.mvps.org
=====================================
"Ulrike Urban" <ULUR@fang_mich_.de> wrote in message
news:5dn3o7F...@mid.individual.net...
--
Ken Johnson (Skywing)
Windows SDK MVP
http://www.nynaeve.net
"Alexander Nickolov" <agnic...@mvps.org> wrote in message
news:unFwtaes...@TK2MSFTNGP02.phx.gbl...
"Skywing [MVP]" <skywing_...@valhallalegends.com> wrote in message
news:uxIUyKhs...@TK2MSFTNGP04.phx.gbl...
BTW, in theory WSASend can do partial writes for blocking
sockets (non-overlapped) as well. In practice this never happens,
not even for non-blocking (non-overlapped) writes. But that's
an implementation detail not guaranteed to persist between
WinSock implementations...
--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnic...@mvps.org
MVP VC FAQ: http://vcfaq.mvps.org
=====================================
"Skywing [MVP]" <skywing_...@valhallalegends.com> wrote in message
news:uxIUyKhs...@TK2MSFTNGP04.phx.gbl...
I used the iocp-server sample as a reference.
--------------------------------------- start snippet ----------------
case ClientIoWrite:
//
// a write operation has completed, determine if all the data
intended to be
// sent actually was sent.
//
lpIOContext->IOOperation = ClientIoWrite;
lpIOContext->nSentBytes += dwIoSize;
dwFlags = 0;
if( lpIOContext->nSentBytes < lpIOContext->nTotalBytes ) {
//
// the previous write operation didn't send all the data,
// post another send to complete the operation
//
------------------------------------- end snippet ----------------
This is the very point of interest. My understanding was, that partial
sends can occur........
If that won't be possible there won't be any problems regarding multiple
threads either.
But who can make a safe statement?
"Ulrike Urban" <Nospam@to_me_.de> wrote in message
news:5dv4jtF...@mid.individual.net...