网络地址顺序的问题?我用SPI拦截了IP数据包(拦截Connect SendTo),但我发现取得的IP地址有时候是反的!?
用FTP对 killpw.51.net 测试时,在ini文件中是 249.3.157.211 //反的
用IE测试时,在ini文件中是 192.168.0.188  //正确
在DLL中的部分代码int WSPAPI WSPConnect(
  SOCKET s,
  const struct sockaddr FAR * name,
  int namelen,
  LPWSABUF lpCallerData,
  LPWSABUF lpCalleeData,
  LPQOS lpSQOS,
  LPQOS lpGQOS,
  LPINT lpErrno
  )
{ if(s!=m_socketTemp && s!=INVALID_SOCKET)
{

SOCKADDR_IN *pInetAddr = (SOCKADDR_IN*)name;
DWORD *pRemoteIp = (DWORD*)&pInetAddr->sin_addr; wsprintf(m_cTemp,"%s",commonfunction.DIPToSIP(pRemoteIp));
m_socketTemp=s;
WritePrivateProfileString("d","d",m_cTemp,"1.ini");
EnterCriticalSection(&m_csIPMoniter);
q.push(m_cTemp);
LeaveCriticalSection(&m_csIPMoniter); } return NextProcTable.lpWSPConnect(s, name, namelen, lpCallerData, lpCalleeData, lpSQOS, lpGQOS, lpErrno);
}
int WSPAPI WSPSendTo(
 SOCKET s,
 LPWSABUF lpBuffers,
 DWORD dwBufferCount,
 LPDWORD lpNumberOfBytesSent,
 DWORD dwFlags,
 const struct sockaddr FAR * lpTo,
 int iTolen,
 LPWSAOVERLAPPED lpOverlapped,
 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
 LPWSATHREADID lpThreadId,
 LPINT lpErrno
 )
{ if(s!=m_socketTemp && s!=INVALID_SOCKET)
{ SOCKADDR_IN *pAddr = (SOCKADDR_IN*)lpTo;
DWORD *pRemoteIp = (DWORD*)&pAddr->sin_addr;
wsprintf(m_cTemp,"%s",commonfunction.DIPToSIP(pRemoteIp));
m_socketTemp=s;
WritePrivateProfileString("d","d",m_cTemp,"1.ini");
EnterCriticalSection(&m_csIPMoniter);
q.push(m_cTemp);
LeaveCriticalSection(&m_csIPMoniter); } return NextProcTable.lpWSPSendTo(s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpTo
, iTolen, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);

}

解决方案 »

  1.   

    字节顺序转化的四个函数:
    htons();ntohs(); //将主机顺序转换为网络顺序,其中s表示short
    htonl();ntohl(); //将网络顺序转换为主机顺序,其中l表示long
      

  2.   

    不行呀,我把4个函数都试了,还是不行.
    当我用 htonl 时候,可以IE上网,但不能登陆传奇网络游戏!!代码如下;
    if(s!=m_socketTemp && s!=INVALID_SOCKET)
    {
      SOCKADDR_IN *pAddr   = (SOCKADDR_IN*)lpTo;
      DWORD *pRemoteIp= (DWORD*)&pAddr->sin_addr;   *pRemoteIp= (DWORD)ntohl(*pRemoteIp)//我是本地拦截Connect SendTo,在此之前,已经
                                          //转换成网络格式,现在转换回来  wsprintf(m_cTemp,"%s",commonfunction.DIPToSIP(pRemoteIp));
      m_socketTemp=s;
      WritePrivateProfileString("d","d",m_cTemp,"1.ini");
      EnterCriticalSection(&m_csIPMoniter);
      q.push(m_cTemp);
      LeaveCriticalSection(&m_csIPMoniter);
    }