我的缓冲区包含元素,但未打印

时间:2009-11-08 10:45:07

标签: c++ messaging sizeof

抱歉抓我的上一篇文章,这是迟到= 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))&lt; 0) DieWithError(“recv()失败”);

msgRcvBuffer [recvMsgSize] ='\ 0';

string msgType(msgRcvBuffer);

cout&lt;&lt; “消息类型”&lt;&lt; msgType&lt;&lt; ENDL; &LT;&LT;&LT;&LT;&LT;&LT;打印时没有任何内容

void handleReg(string message,int socket,string 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不是字符。

非常感谢每个人的帮助=)

3 个答案:

答案 0 :(得分:2)

char*string的转换将字符串视为以空值终止。这似乎不是这种情况 - 特别是,您的char数组似乎包含0个字符,因此字符串将在此位置被截断。

为了避免这种情况,您需要将有效的范围字符传递给string构造函数,而不是只传递开始指针:

msgType = string(msgRcvBuffer, msgRcvBuffer + recvMsgSize);

答案 1 :(得分:1)

如果msgRcvBuffer的大小为RCVBUFSIZE,那么msgRcvBuffer[recvMsgSize] = '\0';将会在我认为的缓冲区末尾写入。

答案 2 :(得分:0)

使用带有缓冲区和缓冲区大小参数的std :: string构造函数:

msgType = std::string(msgRcvBuffer, recvMsgSize);