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 に答える