【问题标题】:how to send and recv specific chars winsock如何发送和接收特定字符winsock
【发布时间】:2012-12-06 05:09:36
【问题描述】:

我有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;
}

【问题讨论】:

  • sizeof(Disconnect) 肯定不是 256。
  • 在你的客户中strMESSAGE不应该是MESSAGE吗?
  • @chris 如果我可以选择评论作为答案,我不敢相信我犯了这样的菜鸟错误,甚至没有注意到。哈哈谢谢。如果我比较 if (Disconnect == "DC") 显然 Disconnect 不等于“DC”,那么在收到 Disconnect 之后还有什么原因吗?
  • @IanLundberg,真的,解决了吗?无论如何,你在那里比较两个指针,而不是字符串。我强烈建议使用std::vector&lt;char&gt; 来代替你的角色,或者使用std::string 进行比较,或者使用std::equal。如果您仍然需要数组,请使用strncmp
  • 我以前没有看到这个,但你也不能分配指针来复制它。您应该为此使用strncpy。通过这个,我说的是Disconnect = "DC";。如果您从不需要传递可修改的字符,您可以跳过向量并直接使用std::string

标签: c++ winsock winsock2


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2019-12-28
    • 1970-01-01
    相关资源
    最近更新 更多