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 "";
        }
    }
}

デバッグとマークされた場所は、メッセージを表示した場所です

ここにビデオがあります。警告、悪い 言葉が含ま れています。

4

0 に答える 0