CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 2 of 2
  1. #1
    Join Date
    Jun 2002
    Location
    Madrid - Spain
    Posts
    28

    Question SDK sockets: recv=-1 BUT WSAGetLastError=0 (???)

    Hi everyone!

    Something weird is happening with an application of mine:
    It works OK on any computer but on one (I have nearly one hundred installations made, up and running)
    The computer on which it is not running is: WinXP professional 2002 SP2 on AMD Athlon64

    Mainly my app is a TCP server.
    Each client has a listening thread with a loop and a call to the platform SDK Windows sockets blocking (synchronous) "recv" function (http://msdn2.microsoft.com/en-us/library/ms740121.aspx) -code below.

    According to MS documentation when function "recv" returns SOCKET_ERROR (-1), an error can therefore be retrieved with WSAGetLastError.
    As you can see, I check WSAGetLastError immediately after returning recv.
    This works perfectly in every computer.
    But on this very one computer out of 100, several times a day, "recv" returns SOCKET_ERROR (-1), BUT WSAGetLastError returns 0
    Sniffing the TCP traffic via Ethereal software I can see that, in fact, the TCP connection is still up: so it is the "recv" function that is telling me a lie.

    Has this happened to anyone out there?
    Have you find any Windows or Athlon64 known bug regarding this matter (recv=-1 but WSAGetLastError=0)?
    Can you think of a way to make my application work on this problematic computer?

    Thank you very much!

    Ricardo Vázquez.
    Madrid, Spain.

    Code:
    int CClientThread::Run()
    {
    	char msg[maxLen];
    
    	while (!bExit) {
    		int nRet = recv(clientSocket, msg, maxLen, 0);
    		if (nRet == SOCKET_ERROR && bExit) {
    			// Stop closes clientSocket on exit. WSAETIMEDOUT
    			err.Format("Stop closes clientSocket on exit");
    			g_logSystem.logWarning(0, err);
    			break;
    		}
    		else if (nRet == SOCKET_ERROR)
    		{
    			int nErr = WSAGetLastError();
    			if (nErr == 0)
    				{
    				err.Format("recv=-1 but WSAGetLastError=0 from client %s on socket %ld.", clientId, clientSocket);
    				g_logSystem.logWarning(0, err);
    				continue;
    				}
    			else
    				{
    				err.Format("Connection lost with client %s on socket %ld. Error code %ld: recv() = SOCKET_ERROR", clientId, clientSocket, nErr);
    				g_logSystem.logWarning(0, err);
    
    				closesocket(clientSocket);
    				server->DeleteClient(clientSocket);
    				cti_RemoveEventListener(this);
    				return SOCKET_ERROR;
    				}
    		}	
    		else if (!nRet) {
    			// Connection has been gracefully closed.
     		        err.Format("Client %s with socket %ld has closed the connection: recv() = 0 (apparently)", clientId, clientSocket);
    			g_logSystem.logNormal(0, err);
    
    			closesocket(clientSocket);
    			server->DeleteClient(clientSocket);
    			cti_RemoveEventListener(this);
    			return 0;
    		}
    		else {
    			msg[nRet] = 0x0;
    			err.Format("[Cli %ld] Received: %s", clientSocket, msg);
    			g_logSystem.logNormal(4, err);
    
    			CString sMensaje;
    			sMensaje = CStrTok(msg, "%");
    			sMensaje.TrimRight();
    			sMensaje.TrimLeft();
    			while (!sMensaje.IsEmpty())
    				{
    				parse(sMensaje);
    				sMensaje = CStrTok("", "%");
    				}
    		}
    	}
    
    	return 0;
    }

  2. #2
    Join Date
    Nov 2002
    Location
    California
    Posts
    4,556

    Re: SDK sockets: recv=-1 BUT WSAGetLastError=0 (???)

    Your app is multi-threaded. You might be encountering a race condition on the shared variables (like bExit).

    Is the Athlon the only dual-core machine your app is running on?

    Try changing the "if-then-else" logic so that the first if tests only bExit, and the second "else if" is changed to a new "if".

    Mike

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured