A question to windows network programming experts.
When I use pseudo-code like this:
reconnect:
s = socket(...);
// more code...
read_reply:
recv(...);
// merge received data
if(high_level_protocol_error) {
// whoops, there was a deviation from protocol, like overflow
// need to reset connection and discard data right now!
closesocket(s);
goto reconnect;
}
Does kernel un-associate and frees all data “physically” received from NIC(since it must really already be there, in kernel memory, waiting for user-level to read it with recv()), when I closesocket()? Well, it logically should since data is not associated with any internal object anymore, right?
Because I don’t really want to waste unknown amount of time for clean shutdown like “call recv() until returns error“. That does not make sense: what if it will never return error, say, server continues to send data forever and not closes connection, but that is bad behaviour?
I’m wondering about it since I don’t want my application to cause memory leaks anywhere. Is this way of forced resetting connection, that still expected to send in unknown amount of data correct?
// optional addition to question: if this method considered correct for windows, can it be considered correct (with change of closesocket() to close() ) for UNIX-compliant OS?
Kernel drivers in Windows (or any OS really), including
tcpip.sys, are supposed to avoid memory leaks in all circumstances, regardless of what you do in user mode. I would think that the developers have charted the possible states, including error states, to make sure that resources aren’t leaked. As for user mode, I’m not exactly sure but I wouldn’t think that resources are leaked in your process either.Sockets are just file objects in Windows. When you close the last handle to a file, the IO manager sends a
IRP_MJ_CLEANUPmessage to the driver that owns the file to clean up resources associated with it. The receive buffers associated with the socket would be freed along with the file object.It does say in the
closesocketdocumentation that pending operations are canceled but that async operations may complete after the function returns. It sounds like closing the socket while in use is a supported scenario and wouldn’t lead to a memory leak.