WedX - журнал о программировании и компьютерных науках

Клиент/сервер с сокетами System .NET в качестве клиента и c++ winsock на сервере

В настоящее время я пишу два проекта, которые должны взаимодействовать друг с другом через TCP, при этом клиент должен быть реализован с использованием System::Net::Sockets, а сервер - с использованием C++ winsock. В течение долгого времени я использовал эту прекрасную функцию для получения текста в winsock, где клиент сначала отправляет длину сообщения, а затем сообщение. Я не хочу ничего менять на стороне сервера с помощью этой функции, но с .NET я сделаю все, что угодно. Это моя попытка.

bool WinSockObject::receiveText(std::string &out)
{
    //Create a temporary buffer to work with
    char buf[4096];
    //Stores textLength of incoming data
    long textLength = 0;
    //Receive the textLength that was sent first
    _result = ::recv(
        _socket, //socket we are receiving on
        reinterpret_cast< char *>(&textLength), //the length of the incoming text
        sizeof(textLength), //number of bytes
        0 //no additional flags necessary
    );
    //Make sure we got the text length
    if (_result == SOCKET_ERROR)
    {
        set_error("Unable to receive text length.");
        return false;
    }
    //Convert the textLength back to host bytes
    textLength = ::ntohl(textLength);
    //Receive the actual message
    _result = ::recv(
        _socket, //socket we are receiving on
        buf, //the input buffer
        textLength, //text length
        0 //no additional flags are necessary
    );
    //Make sure we got the actual message
    if (_result == SOCKET_ERROR)
    {
        set_error("Unable to receive text.");
        return false;
    }
    //Manually terminate the buffer
    buf[textLength] = '\0';
    //Copy the buffer to the output string
    out.append(buf);
    return true;
}

Но я застрял, отправляя сначала длину, а затем сообщение

Socket^ s = gcnew Socket(
    AddressFamily::InterNetwork,
    SocketType::Stream,
    ProtocolType::Tcp
);
s->Connect(server, port); //message to send
String^ howdy = "howdy";
int strLength = howdy->Length; //length of message
String^ length = strLength.ToString(); //convert it to String
//get the bytes
array<Byte>^msgLength = Encoding::ASCII->GetBytes(length);
//send the message length
int bytes = s->Send(msgLength);
//send the actual message
array<Byte>^msg = Encoding::ASCII->GetBytes(howdy);
bytes = s->Send(msg);
04.04.2011

Ответы:


1

Есть две проблемы, которые я вижу после краткого чтения:

  1. Вы отправляете длину строки в виде строки, но сервер считывает ее как двоичную.
  2. Сервер предполагает, что recv всегда будет читать запрошенное количество байтов. Это не правильно; recv может вернуть 0 (если другая сторона корректно закрыла соединение), любое значение в диапазоне [1, len] (если некоторые данные были получены успешно) или SOCKET_ERROR (если произошла ошибка).
04.04.2011
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]