2012-12-18 30 views
1

我有char* MESSAGE = new char[256];char* DISCONNECT = new char[256];然而,當我使用Winsock的從客戶端發送它們,並在服務器收到他們(服務器有相同的字符名稱)出於某種原因char* MESSAGE攔截char* DISCONNECT任何幫助爲什麼這將是偉大的!如何發送和recv特定字符的Winsock

Cient:

private: System::Void Form1_FormClosing(System::Object^ sender, System::Windows::Forms::FormClosingEventArgs^ e) { 
     char* Disconnect = new char[256]; 
     ZeroMemory(Disconnect, sizeof(Disconnect)); 
     Disconnect = "DC"; 
     send(sConnect, "DC", 256, NULL); 
    } 

private: System::Void txtMessage_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e) { 
     if(e->KeyCode == Keys::Enter && txtMessage->Text != "") 
     { 
      char* MESSAGE = new char[sizeof(txtMessage->Text->Length)]; 
      ZeroMemory(MESSAGE, sizeof(MESSAGE)); 

      string strMESSAGE = ""; 

      MarshalString(txtMessage->Text, strMESSAGE); 

      send(sConnect, strMESSAGE.c_str(), strMESSAGE.length(), NULL); 
      txtMessage->Clear(); 
     } 
    } 

服務器:

int RecieveThread() 
{ 
ZeroMemory(MESSAGE, sizeof(MESSAGE)); 
for (;; Sleep(50)) 
{ 
    if(recv(sConnect, MESSAGE, 256, NULL) != SOCKET_ERROR) 
    { 
     printf("<%s:> %s\n", NAME, MESSAGE); 
    } 
} 
return 0; 
} 

int DisconnectThread() 
{ 
ZeroMemory(Disconnect, sizeof(Disconnect)); 
for(;; Sleep(50)) 
{ 
    if(recv(sConnect, Disconnect, 256, NULL) != SOCKET_ERROR) 
    { 
     if (Disconnect == "DC") 
     { 
      printf("has disconnected."); 
     } 
    } 
} 
return 0; 
} 
+0

'sizeof(Disconnect)'當然不是256. – chris

+0

不應該在客戶端的'strMESSAGE'是'MESSAGE'? – Cyclonecode

+0

@chris如果我可以選擇一個評論作爲答案,我會,我不能相信我做了這樣的noob錯誤,甚至沒有注意到。哈哈謝謝。也有任何理由爲什麼後斷開接收如果我比較'如果(斷開==「DC」)'顯然斷開不等於「DC」? –

回答

2

其中在評論中提到的其他錯誤,您的recv用途是等待發生的問題。 recv函數讀取您指定的字節數,不完全是該數字。如果您獲得的字節較少,則需要再次撥打recv

另外,從來沒有recv扔掉返回值。這是瞭解您實際獲得多少個字節的數據的唯一途徑。

TCP層不知道你認爲256字節是應用層消息。它不會將這些字節粘合在一起。只有你的代碼知道這一點,所以當你的代碼被接收到時,你的代碼有責任把這些消息放回去。

+1

這是一個經典! –