0

这是我遇到过的最不寻常的事情,我正在用聊天框制作游戏,所以我正在构建一个审查功能,但我遇到了很多麻烦,虽然一切都应该工作,所以我尝试调试,我发现如果你将一个字符串设置为一个坏词(我可以在这里说它们吗?)这些词以 f、c 和 p 开头。(猜猜哪个)。因此,在客户端(Java)中输入消息,它将通过套接字发送(在发送到服务器之前显示消息(在 C++ 中),它显示得很好,但是在服务器中接收到这个词之后我显示消息,在你说的坏词的第一个字母之后,后面的所有内容都被删除。我没有显示源,因为它没有发生在程序中?客户端信息:Java,Netbeans 默认编译器服务器信息:C++,

一些资料来源:Java crypt 函数

public String crypt(String source)
{
    int len=source.length();
    String tempSource="";
    int i;
    for(i=0;i<len;i++)
    {
        String strAddon;
        int intAddon;
        char charAddon;
        charAddon=source.charAt(i);
        intAddon=127-((int)(charAddon));
        charAddon=(char)intAddon;
        strAddon=Character.toString(charAddon);
        tempSource+=strAddon;
    }
    source=tempSource;
    return source;
}

Java写函数:

public void write(String text)
{
    try
    {
        text="|/" + text + "\\|";
        System.out.println(text);//debug
        text=crypt(text);
        out.println(text);
    }
    catch(Exception err)
    {
        Logger.getLogger(Sockets.class.getName()).log(Level.SEVERE, null, err);
        closeSockets(1);
    }
}

C++ 加密函数

string crypt(string source)
{
    int len=source.length();
    char tempSource[len];
    source.copy(tempSource, len, 0);
    int i=0;
    for(i=0;i<len;i++) tempSource[i]=127-tempSource[i];
    source=tempSource;
    int temp=0;
    while((temp=source.find('\n',0)) != string::npos)
    {
        source=source.replace(temp,temp+1,"|");
        temp++;
    }
    return source;
}

C++ 读取函数

string clientRead(int sock, string username)
{
    if(sock == INVALID_SOCKET) return "";
    vector<char> theVector;
    char responseData[256];
    char buffer;
    int bytesRead;

    memset(responseData, 0, sizeof(responseData));
    while(1)
    {
        bytesRead=recv(sock, &buffer, 1, 0);
        if(bytesRead > 0)//check to exit
        {
            if(buffer == '\n')
            {
                for(int i=0;i<theVector.size();i++) responseData[i]=theVector[i];
                string decryptedData=crypt(responseData);
                int beginIndex=decryptedData.find_first_of("|/")+2;
                if(beginIndex == -1) beginIndex=0;
                int endIndex=decryptedData.find("\\|");
                if(endIndex == -1) endIndex=decryptedData.length();
                decryptedData=decryptedData.substr(beginIndex, endIndex);
                cout<<decryptedData<<endl;//debug
                return decryptedData;
            }
            else theVector.push_back(buffer);
        }
        else//it failed
        {
            if(username.compare("") != 0) forceLogout(username);
            return "";
        }
    }
}

标记为调试的地方是我显示消息的地方

这是它的视频,警告,里面有不好的词 http://youtu.be/bSFT5YyAk9E 正如你所看到的,当我用 f 说这个词时,它就会中断。

4

0 回答 0