// MySockets.cpp: implementation of the CMySockets class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "MySockets.h"
#include "ReplaceDll.h"
#include "assert.h"
#include "wsipx.h"
#include <exception>
#include <malloc.h>
#define KEEPALIVE_TIME 10 //保活时间
const int BaseBeepValue = 500;
const int BaseBeepStep = 100;
const int BeepTime = 20;
const int AddOnDataSize = sizeof(struct AddOnData);
SOCKET WSAAPI m_accept(SOCKET s, struct sockaddr FAR * addr, int FAR * addrlen)
{
pLog->WriteStrLn("accept");
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "accept");
assert(pInfo != NULL);
return ((LPFN_ACCEPT)pInfo->OldProc)(s, addr, addrlen);
}
int WSAAPI m_bind(SOCKET s, const struct sockaddr FAR * name, int namelen)
{
pLog->WriteStrLn("bind");
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "bind");
assert(pInfo != NULL);
LPFN_BIND RealBind = (LPFN_BIND)pInfo->OldProc;
int iRet = RealBind(s, name, namelen);
if(name->sa_family == AF_INET)
{
DWORD dwThreadId;
DWORD sockThread = s;
HANDLE hThread = CreateThread( NULL,
0,
KeepThdCallBack,
&sockThread,
0,
&dwThreadId );
pLog->WriteHintIntLn("传递给线程的Socket sockThread=", sockThread);
pLog->WriteHintIntLn("创建线程 Thread Handle=", (int)hThread);
//休眠20ms,防止传递的参数被别的线程改变
Sleep( 20 );
if ( hThread )
CloseHandle( hThread );
}
return iRet;
}
int WSAAPI m_closesocket(SOCKET s)
{
pLog->WriteStrLn("closesocket");
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "closesocket");
assert(pInfo != NULL);
return ((LPFN_CLOSESOCKET)pInfo->OldProc)(s);
}
int WSAAPI m_connect(SOCKET s, const struct sockaddr FAR * name, int namelen)
{
pLog->WriteStrLn("connect");
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "connect");
assert(pInfo != NULL);
return ((LPFN_CONNECT)pInfo->OldProc)(s, name, namelen);
}
int WSAAPI m_ioctlsocket(SOCKET s, long cmd, u_long FAR * argp)
{
pLog->WriteStrLn("ioctlsocket");
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "ioctlsocket");
assert(pInfo != NULL);
return ((LPFN_IOCTLSOCKET)pInfo->OldProc)(s, cmd, argp);
}
int WSAAPI m_getpeername(SOCKET s, struct sockaddr FAR * name, int FAR * namelen)
{
pLog->WriteStrLn("getpeername");
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "getpeername");
assert(pInfo != NULL);
return ((LPFN_GETPEERNAME)pInfo->OldProc)(s, name, namelen);
}
int WSAAPI m_getsockname(SOCKET s, struct sockaddr FAR * name, int FAR * namelen)
{
pLog->WriteStrLn("getsockname");
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "getsockname");
assert(pInfo != NULL);
LPFN_GETSOCKNAME RealGetSockName = (LPFN_GETSOCKNAME)pInfo->OldProc;
int iRet = RealGetSockName(s, name, namelen);
if(name->sa_family == AF_INET)
{
((sockaddr_in *)name)->sin_addr.S_un.S_addr = g_dwMyVirtualIP;
}
else if(name->sa_family == AF_IPX)
{
//此处留着给IPX使用
}
pLog->WriteHintStrLn("Getsockname 地址: ", inet_ntoa(((sockaddr_in *)name)->sin_addr));
return iRet;
}
int WSAAPI m_getsockopt(SOCKET s, int level, int optname, char FAR * optval, int FAR * optlen)
{
pLog->WriteStrLn("getsockopt");
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "getsockopt");
assert(pInfo != NULL);
LPFN_GETSOCKOPT RealGetsockopt = (LPFN_GETSOCKOPT)pInfo->OldProc;
char hint[64];
switch(level)
{
case IPPROTO_IP:
strcpy(hint, "IPPROTO_IP");
break;
case IPPROTO_UDP:
strcpy(hint, "IPPROTO_UDP");
break;
case IPPROTO_TCP:
strcpy(hint, "IPPROTO_TCP");
break;
case NSPROTO_IPX:
strcpy(hint, "NSPROTO_IPX");
break;
case NSPROTO_SPX:
strcpy(hint, "NSPROTO_SPX");
break;
default:
strcpy(hint, "other");
break;
}
pLog->WriteHintStrLn("GetSockOpt Type=", hint);
return RealGetsockopt(s, level, optname, optval, optlen);
}
int WSAAPI m_listen(SOCKET s, int backlog)
{
pLog->WriteStrLn("listen");
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "listen");
assert(pInfo != NULL);
return ((LPFN_LISTEN)pInfo->OldProc)(s, backlog);
}
int WSAAPI m_recv(SOCKET s, char FAR * buf, int len, int flags)
{
pLog->WriteHintIntLn("recv Count=", len);
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "recv");
assert(pInfo != NULL);
return ((LPFN_RECV)pInfo->OldProc)(s, buf, len, flags);
}
int WSAAPI m_recvfrom(
SOCKET s,
char FAR * buf,
int len,
int flags,
struct sockaddr FAR * from,
int FAR * fromlen
)
{
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "recvfrom");
if(pInfo == NULL)
pLog->WriteStrLn("GetRecvfrom Function Error");
LPFN_RECVFROM Realrecvfrom = (LPFN_RECVFROM)pInfo->OldProc;
pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "getsockname");
if(pInfo == NULL)
pLog->WriteStrLn("Getgetsockname Function Error");
LPFN_GETSOCKNAME Realgetsockname = (LPFN_GETSOCKNAME)pInfo->OldProc;
//debug用
//int iDet = Realrecvfrom(s, buf, len, flags, from, fromlen);
//pLog->WriteHintIntLn("DebugRecvFrom iDet=", iDet);
//pLog->WriteHintIntLn("DebugRecvFrom Error=", WSAGetLastError());
//return iDet;
sockaddr selfaddr;
int addrlen = sizeof(sockaddr);
int GetsockRet = Realgetsockname(s, &selfaddr, &addrlen);
if(GetsockRet == SOCKET_ERROR)
{
int MyLastError = WSAGetLastError();
pLog->WriteHintIntLn("recvfrom调用getsockname出错 ErrorNO=", MyLastError);
}
char familystr[32];
GetFamilyStr(selfaddr.sa_family, familystr);
pLog->WriteHintStrLn("recvfrom Type=", familystr);
if(selfaddr.sa_family != AF_INET)
{
return Realrecvfrom(s, buf, len, flags, from, fromlen);
}
int iRet, myLastError;
int newLen = len + AddOnDataSize;
char *newbuf;
try
{
newbuf = new char[newLen];
iRet = Realrecvfrom(s, newbuf, newLen, flags, from, fromlen);
myLastError = GetLastError();
pLog->WriteHintIntLn("recvfrom 结果=", iRet);
if(myLastError == 10035)
{
SetLastError(myLastError);
throw exception("");
}
if(iRet > 0)
{
//判断是否是从服务器过来的数据,如果不是,则不处理
if(((sockaddr_in *)from)->sin_addr.S_un.S_addr != g_nServerIp)
{
pLog->WriteHintIntLn("recvfrom接受到不是从服务器过来的数据 iRet=", iRet);
memcpy(buf, newbuf, iRet);
}
else
{
pLog->WriteStrLn("recvfrom接受到从服务器过来的数据");
//复制数据到源buf
iRet = iRet - AddOnDataSize;
memcpy(buf, newbuf, iRet);
//读取AddOnData
AddOnData AData;
memcpy(&AData, newbuf + iRet, AddOnDataSize);
//将虚拟信息给系统sa, 这里暂定所有协议都为Udp协议
((sockaddr_in *)from)->sin_addr.s_addr = AData.VirtualIP;
((sockaddr_in *)from)->sin_port = AData.RealBindPort;
}
}
else
{
if(iRet != SOCKET_ERROR) memcpy(buf, newbuf, iRet);
}
delete [] newbuf;
}
catch(...)
{
//pLog->WriteHintIntLn("调用修改后Recvfrom出错 ErrorNo=", myLastError);
delete [] newbuf;
}
return iRet;
}
int WSAAPI m_select(
int nfds,
fd_set FAR * readfds,
fd_set FAR * writefds,
fd_set FAR *exceptfds,
const struct timeval FAR * timeout
)
{
pLog->WriteStrLn("select");
PReplaceInfo pInfo = g_pReplaceDll->ReplaceInfo.FindByName(WSOCK32_NAME, "select");
assert(pInfo != NULL);
return ((LPFN_SELECT)pInfo->OldProc)(nfds, readfds, writefds, exceptfds, timeout);
}
int WSAAPI m_send(SOCKET s, const char
实现浩方平台的半成品代码
4星 · 超过85%的资源 需积分: 10 55 浏览量
2008-11-10
22:30:40
上传
评论 2
收藏 265KB RAR 举报
yanghy2013
- 粉丝: 1
- 资源: 3
最新资源
- tensorflow-rocm-2.13.1.600-cp39-cp39-manylinux2014-x86-64.whl
- tensorflow-gpu-2.7.0-cp39-cp39-manylinux2010-x86-64.whl
- tensorflow-gpu-2.7.0-cp38-cp38-manylinux2010-x86-64.whl
- 电子科大 电路分析与模拟电路 实验报告.pdf
- 各位大佬哥哥可以帮我看一下吗
- image-gradients.zip
- 5G频点频率计算方法.xlsx
- python 企业编码管理 计算机毕业设计.zip
- vue-基于vue2+vuex+axios实现的天气预报小项目.zip
- wyxnxhw.apk
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈