网络地址顺序的问题?我用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);
}
用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);
}
解决方案 »
- 对话框程序 父对话框响应子对话框控件消息
- 获取异常信息
- 如何网页上的”超級"这种字段转换为CSring?
- CSocket问题
- 一个创建线程的小程序,结果非预期,清高手指点
- 急救!!VC++如何上路?高手、英雄请进!!
- 一个多页的属性对话框,我单击页眉,如何获得这个消息?
- WIN2000下怎么实现ATX电源关机?
- 为什么DIRECTDRAW中创建委托内存页面不成功
- OnChar消息判断切换中文shitf+ctrl //组合键是俩个key值相加吗???还是什么
- 怎样让MainFrame知道一个工具条关闭了?急!
- ***** 急!!!! 高手请进,关于SplitterWnd!*****
htons();ntohs(); //将主机顺序转换为网络顺序,其中s表示short
htonl();ntohl(); //将网络顺序转换为主机顺序,其中l表示long
当我用 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);
}