我有char* MESSAGE = new char[256];
和char* DISCONNECT = new char[256];
但是当我使用winsock从客户端发送它们并在服务器中接收它们时(服务器具有相同的字符名称)由于某种原因char* MESSAGE
拦截char* DISCONNECT
任何帮助,为什么这将是伟大的!
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 :(得分:2)
在评论中提到的其他错误中,您使用recv
是一个等待发生的问题。 recv
函数读取最多您指定的字节数,而不是该数字。如果您获得更少的字节,则需要再次调用recv
。
此外,从不丢弃recv
的返回值。这是了解实际数据字节数的唯一方法。
TCP层不知道您将256字节视为应用层消息。它不会将这些字节粘合在一起。只有您的代码知道这一点,因此您的代码有责任在收到消息后将消息重新组合在一起。