как отправлять и получать определенные символы winsock

У меня есть 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;
}

person Ian Lundberg    schedule 18.12.2012    source источник
comment
sizeof(Disconnect) определенно не 256.   -  person chris    schedule 19.12.2012
comment
разве strMESSAGE в вашем клиенте не должно быть MESSAGE?   -  person Cyclonecode    schedule 19.12.2012
comment
@chris, если бы я мог выбрать комментарий в качестве ответа, я бы сделал это, я не могу поверить, что совершил такую ​​нубскую ошибку и даже не заметил. Хаха спасибо. Также есть ли какая-либо причина, по которой после получения Disconnect, если я сравниваю if (Disconnect == "DC"), что, по-видимому, Disconnect не равно DC?   -  person Ian Lundberg    schedule 19.12.2012
comment
@IanLundberg, правда, это исправило? В любом случае, вы сравниваете два указателя, а не строки. Я настоятельно рекомендую вместо этого использовать std::vector<char> для хранения ваших персонажей и либо сделать из него std::string для сравнения, либо использовать std::equal. Если вам все еще нужны массивы, используйте strncmp.   -  person chris    schedule 19.12.2012
comment
Я не видел этого раньше, но вы также не можете назначать указатели для его копирования. Вы должны использовать strncpy для этого. Под этим я говорю о Disconnect = "DC";. Если вам никогда не нужно передавать изменяемые символы, вы можете пропустить вектор и также использовать std::string с места в карьер.   -  person chris    schedule 19.12.2012
comment
@chris да, оказывается, это на самом деле не помогло. Это просто сработало, когда я в первый раз ввел сообщение, оно прошло нормально, но затем я набрал другое сообщение для отправки, и оно сказало то, что я хотел сказать, если форма закрыта. tl;dr проблема все еще существует :/   -  person Ian Lundberg    schedule 19.12.2012
comment
@chris, и мне нужно иметь возможность проверить, имеет ли значение в массиве символов только DC в нем iirc strncpy просто копирует один символ в другой символ? это не очень помогает в этой ситуации, если я что-то упустил? также я ценю помощь до сих пор   -  person Ian Lundberg    schedule 19.12.2012
comment
@IanLundberg, в своем клиенте вы назначаете адрес DC Disconnect. Это не копирует символы; он просто присваивает указатель, а это значит, что у вас определенно будет утечка памяти. Используя массивы, strncmp будет сравнивать строки.   -  person chris    schedule 19.12.2012
comment
@chris хорошо, у меня это работает, но когда оно равно DC, оно постоянно печатает бла, отключился. а не сделать это один раз. Я не совсем уверен, почему он это делает. Если бы вы могли дать мне советы, это текущий код, который у меня есть. pastebin.com/Xd9ze5WB   -  person Ian Lundberg    schedule 19.12.2012
comment
Я не уверен, так как мало использовал сокеты, но recv, вероятно, не возвращает SOCKET_ERROR по какой-то причине.   -  person chris    schedule 19.12.2012


Ответы (1)


Среди других ошибок, упомянутых в комментариях, использование вами recv — это проблема, ожидающая своего решения. Функция recv считывает до указанного вами количества байтов, а не точно этого числа. Если вы получаете меньше байтов, вам нужно снова вызвать recv.

Кроме того, никогда не удаляйте возвращаемое значение из recv. Это единственный способ узнать, сколько байтов данных вы на самом деле получили.

Уровень TCP понятия не имеет, что вы считаете 256 байтов сообщением прикладного уровня. Он не склеивает эти байты вместе. Только ваш код знает это, поэтому ваш код отвечает за сбор сообщений после их получения.

person David Schwartz    schedule 18.12.2012