1

前回の投稿をスクラッチして申し訳ありません。遅くなりました =S しかし、基本的に、作成したバッファの送信に問題があります。私がどこで間違っているのかを知る必要があるだけです =( またはもっと良い方法があるかどうか。

------ クライアント送信ユーザー名 -------

int bufferSize = 32;


char messageBuffer[bufferSize];


char* message;


if (userName.size() > 8)
{
    cout << "Invalid username : Greater than 8 characters" << endl;
}
else
{
    switch(regType)
    {
        case(REGISTER):
        {
            cout << "Registered name: " << userName << endl;
            messageBuffer[0] = 1;
            messageBuffer[1] = 0;
            for (int i = 2; i < (userName.size() + 2); i++)
            {
                messageBuffer[i] = userName[(i - 2)];
            }

            for (int i = 0; i < (userName.size() + 2); i++)
            {
                cout << messageBuffer[i];
            }
            cout << "<<<< messageBuffer " << endl;

            message = &messageBuffer[0];
            cout << messageBuffer << endl;
            //message[(userName.size() + 2)] = '\0';
            int messageLen = userName.size() + 2;
            if (send(sock, messageBuffer, messageLen, 0) != messageLen)
                DieWithError("send() send an invalid name");



        }break;
        case(UNREGISTER):
        {
        }break;
    }

}

----------- サーバー (受信側)------------ char msgRcvBuffer[RCVBUFSIZE];

int recvMsgSize;

if ((recvMsgSize = recv(clntSocket, msgRcvBuffer, RCVBUFSIZE, 0)) < 0) DieWithError("recv() 失敗");

msgRcvBuffer[recvMsgSize] = '\0';

string msgType( msgRcvBuffer );

cout << "メッセージ タイプ" << msgType << endl; <<<<<< 印刷しても何も表示されない

void handleReg(文字列メッセージ、int ソケット、文字列 ipAddr) {

// Remove the Prefix
int startIndex = 2;
// Get the username from the message

string userName = message.substr(startIndex, message.size() - startIndex);
cout << "Username " << userName << endl;

何らかの理由で、私のメッセージ文字列はただ 1 です... =S 私がやろうとしているのは、クライアントから送信されたものからメッセージを取得することです。バッファの先頭から「1」と「0」を削除しようとしています。1 と 0 は文字ではありません。

みんなの助けに感謝します=)

4

3 に答える 3

2

char*からへの変換でstringは、文字列が null で終わるものとして扱われます。ここではそうではないようです。特に、char配列に含まれる文字が 0 であるように見えるため、文字列はこの位置で切り取られます。

これを回避するには、開始ポインターのみの代わりに、有効な範囲の文字をコンストラクターに渡す必要があります。string

msgType = string(msgRcvBuffer, msgRcvBuffer + recvMsgSize);
于 2009-11-08T10:54:13.100 に答える
1

msgRcvBufferサイズが大きい場合はRCVBUFSIZEmsgRcvBuffer[recvMsgSize] = '\0';バッファの終わりを超えて書き込むことになると思います。

于 2009-11-08T10:55:50.603 に答える
0

バッファーとバッファー サイズのパラメーターを受け取る std::string コンストラクターを使用します。

msgType = std::string(msgRcvBuffer, recvMsgSize);
于 2009-11-08T10:56:21.867 に答える