2012-12-18 31 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

这是一个经典! –