Jag har en client/server lösning som sänder små paket, 10-50 bytes.Problem med klient/server lösning, IOCP och sockets.
Servern körs på win2000 och använder IO Completion Ports samt WSARecv/WSASend.
Klienten använder en egentillverkad socketklass, den använder WSARecv/WSASend och overlapped io.
Både klienten/servern har alltid en WSARead igång (förutom när de behandlar inkommande data).
Serversidan:
De två första transaktionerna behandlas ok och svar skickas tillbaka till klienten OK.
Båda transaktionerna kommer i samma WSARecv.
Den tredje transaktionen som skickas några sekunder senare gör så att WSARead rapportera, via iocp funktionen, att 0 bytes är mottagna.
Klientsidan:
De två första transaktionerna skickas OK och svaret tas emot OK.
Den tredje transaktionen skickas OK (men som sagt mottags den inte OK på serversidan.)
Jag har provat att disabla Nagle Algoritmen samt satt SO_SNDBUF/SO_RCVBUF till 0.
Spontant känns det som att felet har med WSARecv eftersom det är första läsningen från den som falerar. Innan är det AcceptEx som har tagit emot datat.
klient loggen:
Socket(3)(Connect): WSAConnect() OK!
Socket(3)(Read): WSARecv
Socket(3)(Read): pending read...
Send Trans: 0
Send Trans: 2
Socket(3)(Send): New data triggered.
Socket(1)(Send): WSASend
Socket(3)(Send): Write completed
Socket(3)(Read): Read completed.
Socket(2)(Read): WSAGetOverlappedResult
Recieve, Trans: 0
Socket(2)(Read): 71/71 bytes handled
Socket(3)(Read): WSARecv
Socket(1)(Read): Completed directly 14 bytes
Recieve, Trans: 2
Socket(2)(Read): 14/14 bytes handled
Socket(3)(Read): WSARecv
Socket(3)(Read): pending read...
Send Trans: 3
Socket(3)(Send): New data triggered.
Socket(1)(Send): WSASend
Socket(3)(Send): Write completed
Socket(3)(Read): Read completed.
Socket(2)(Read): WSAGetOverlappedResult <- returns 0 bytes
serverloggen:
prio: 1 client: 4 Connect from 127.0.0.1:1201
prio: 1 client: 4 Read -> Incomming bytes: 29
prio: 3 client: 4 Recieve, Trans: 0
prio: 3 client: 4 Send, Trans: 0
prio: 1 client: 4 Send -> WSASend
prio: 2 client: 4 Send ->Sent 71/71 bytes. (flags: 0)
prio: 3 client: 4 Recieve, Trans: 2
prio: 3 client: 4 Send, Trans: 2
prio: 1 client: 4 Send -> WSASend
prio: 2 client: 4 Send ->Sent 14/14 bytes. (flags: 0)
prio: 2 client: 4 Read -> 29/29 bytes handled
prio: 1 client: 4 Read -> WSARecv
prio: 2 client: 4 Read -> Pending read inited
prio: 0 client: 4 0 bytes read!
prio: 1 client: 4 Read -> aborting, dead or shutting down...
Vad kan vara fel?