2009-11-08 56 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);