2009-11-08 92 views
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; 
    } 

} 

---- -------服务器(接收机)------------ 炭msgRcvBuffer [RCVBUFSIZE];

INT recvMsgSize;

如果((recvMsgSize =的recv(clntSocket, msgRcvBuffer,RCVBUFSIZE,0))< 0) DieWithError(“recv()failed”);

msgRcvBuffer [recvMsgSize] ='\ 0';

string msgType(msgRcvBuffer);

COUT < < “消息类型” < < MSGTYPE < < ENDL;印刷

当出现< < < < < <没有

无效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 = ... =什么我试图做的只是从客户端发送的消息中获取消息。我只是试图从缓冲区开始删除'1'和'0'。 1和0不是字符。

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

+4

有什么问题吗? – Hasturkun 2009-11-08 10:47:34

回答

2

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

为了规避这一点,你需要的字符的有效范围传递给string构造,仅在原地开始指针:

msgType = string(msgRcvBuffer, msgRcvBuffer + recvMsgSize); 
+0

甜蜜感谢它的工作=) – 2009-11-08 11:18:03

1

如果msgRcvBuffer是大小RCVBUFSIZE的那么msgRcvBuffer[recvMsgSize] = '\0';打算写作超出我想的缓冲区的末端。

0

使用的std :: string构造函数,接受一个缓冲区,缓冲区的大小参数:

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