I'm going to build mmorpg server with reusable sockets
Question 1
An accepted socket (via AcceptEx and posted one WSARecv()) is disconnected by peer (by zero byte notify receiving) in that case, could I call TransmitFile (TF_DISCONNECT | TF_REUSE_SOCKET) ? if its not possible, what should I do?
Question 2
If my server received an illegal packet or some hack attempts by peer, so I've to disconnect peer, how could I disconnect peer immediately (non-graceful) and make peer socket reusable?
Question 3
Some pseudo codes
1. Method
Enqueue received data and post new WSARecv() directly, then process received data (in order to, get received data(s) and enqueue them while processing received packets)
case OVL_RECV:
{
CircularBuffer->WriteData(recvBuffer, dwRecvBytes);
WSARecv(socket, recvBuffer, dwRecvBytes)
Lock();
char buf[4096];
int read = CircularBuffer->ReadData(buf, sizeof buf);
ProcessReceive(buf, read);
Unlock();
}
or
2. Method
Process received data and post new WSARecv()
case OVL_RECV
{
Lock();
ProcessReceive(recvBuffer, dwRecvBytes);
WSARecv(socket, recvBuffer, dwRecvBytes);
Unlock();
}
which method is better for performance ?
Question 4
DisconnectEx (TF_REUSE_SOCKET) versus TransmitFile (TF_DISCONNECT | TF_REUSE_SOCKET), are there any performance issues? which one should I use for make socket reusable?