C ++ send / recv绕行和getpeername()

时间:2012-04-08 17:09:34

标签: c++ winsock send recv

编辑:我发现了问题,显然游戏客户端不喜欢从绕道函数写入文件时。我不知道它与getpeername()有什么关系,但它已经解决了。

朋友有一个游戏服务器,并且使用机器人的问题直接与服务器通信以模拟客户端。 我决定绕过recv并发送给客户端和服务器并应用一个简单的XOR加密系统,这样机器人和其他不受保护的客户端就无法在他的服务器上运行。

我把所有东西拼凑在一起但是在最后一刻我发现客户端还与http服务器进行通信,我无法应用绕行,所以我必须检查客户端是否尝试使用send和recv on the http服务器所以我不对这些数据包应用加密/解密。

int WINAPI Myrecv(SOCKET s,char* buf,int len,int flags)
{
        SOCKADDR_IN saddr;
        zero(saddr);
        int l=sizeof(saddr);
        bool http=false;

        getpeername(s,(SOCKADDR*)&saddr,&l);
        if(htons(saddr.sin_port)==80)
            http=true;

        if(!encryption || http)
        {
            return origrecv(s,buf,len,flags);
        }
        else
        {
               blah blah blah..

               int r=origrecv(s,mybuf,len,flags);
               if(r<=0)
                  return r;

               decrypt packet, and copy it to buf
               return r;
        }
}

似乎getpeername()破坏了else中的origrecv()而反之(在过去,origrecv()的实现在getpeername()之前),origrecv()也返回-1,如果getpeername()是在origrecv()之后,客户端崩溃了。

getsockname()会产生同样的问题。

0 个答案:

没有答案