1

我有char* MESSAGE = new char[256];但是char* DISCONNECT = new char[256];当我使用winsock从客户端发送它们并在服务器中接收它们(服务器具有相同的字符名称)时,出于某种原因会char* MESSAGE拦截char* DISCONNECT任何关于为什么这会很棒的帮助!

城市:

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;
}
4

1 回答 1

2

在评论中提到的其他错误中,您的使用recv是一个等待发生的问题。该函数最多recv读取您指定的字节数,而不是确切的数字。如果你得到更少的字节,你需要再次调用。recv

另外,永远不要丢弃recv. 这是知道您实际获得了多少字节数据的唯一方法。

TCP 层不知道您将 256 字节视为应用层消息。它不会将这些字节粘合在一起。只有您的代码知道这一点,因此您的代码有责任在收到消息时将它们重新组合在一起。

于 2012-12-18T23:52:53.860 回答