user31217: In order to send a NetMsgType::PING message to a node pnode, we simply invoke the function pnode->PushMessage(NetMsgType::PING) in src/main.cpp
This translates into following logic in src/net.h:
void PushMessage(const char* pszCommand)
{
    try
    {
        BeginMessage(pszCommand);
        EndMessage(pszCommand);
    }
    catch (...)
    {
        AbortMessage();
        throw;
    }
}

If we look carefully, the BeginMessage and EndMessage are just for acquiring and releasing the lock. Where exactly is the PING getting passed to the other node? I think the working is similar for other message types but the overloaded function PushMessage may use a Datastream which I guess does the passing to requested node. But I am particularly clueless about cases like NetMsgType::GETADDR, NetMsgType::VERACK and old version without nonce of NetMsgType::PING where there is only the command string pszCommand being passed

user31217: I got the answer myself. Sorry!
The src/net.cpp has this logic which explains all:
void CNode::BeginMessage(const char* pszCommand) EXCLUSIVE_LOCK_FUNCTION(cs_vSend)
{
    ENTER_CRITICAL_SECTION(cs_vSend);
    assert(ssSend.size() == 0);
    ssSend << CMessageHeader(Params().MessageStart(), pszCommand, 0);
    LogPrint("net", "sending: %s ", SanitizeString(pszCommand));
}


31217: <p>In order to send a <code>NetMsgType::PING</code> message to a node <code>pnode</code>, we simply invoke the function <code>pnode-&gt;PushMessage(NetMsgType::PING)</code> in <code>src/main.cpp</code></p>

<p>This translates into following logic in <code>src/net.h</code>:</p>

<pre><code>void PushMessage(const char* pszCommand)
{
    try
    {
        BeginMessage(pszCommand);
        EndMessage(pszCommand);
    }
    catch (...)
    {
        AbortMessage();
        throw;
    }
}
</code></pre>

<p>If we look carefully, the <code>BeginMessage</code> and <code>EndMessage</code> are just for acquiring and releasing the lock. Where exactly is the <code>PING</code> getting passed to the other node? I think the working is similar for other message types but the overloaded function <code>PushMessage</code> may use a Datastream which I guess does the passing to requested node. But I am particularly clueless about cases like <code>NetMsgType::GETADDR</code>, <code>NetMsgType::VERACK</code> and old version without nonce of <code>NetMsgType::PING</code> where there is only the command string <code>pszCommand</code> being passed</p>
 31217: <p>I got the answer myself. Sorry!</p>

<p>The <code>src/net.cpp</code> has this logic which explains all:</p>

<pre><code>void CNode::BeginMessage(const char* pszCommand) EXCLUSIVE_LOCK_FUNCTION(cs_vSend)
{
    ENTER_CRITICAL_SECTION(cs_vSend);
    assert(ssSend.size() == 0);
    ssSend &lt;&lt; CMessageHeader(Params().MessageStart(), pszCommand, 0);
    LogPrint("net", "sending: %s ", SanitizeString(pszCommand));
}
</code></pre>
