Передача строк в сокетах

206
17 декабря 2019, 06:40

код сервера

    uint32_t sizeStr;
    string message;
    while (1)
    {
        if((sock = accept(socketR, NULL, NULL))>0)
        {
            bytes_read = recv(sock, &sizeStr, sizeof(uint32_t),0);
            bytes_read = recv(sock,&message, sizeStr,0);
        }
    }

код клиента

    string message = "hello";
    uint32_t sizeStr = message.length();
    send(sock,&sizeStr,sizeof(uint32_t),0);
    send(sock,&message,sizeStr,0);

Почему нельзя просто целиком отправить строку как в случае с uint32_t?Я знаю,что на стороне сервера нужен буфер,на клиентe привести к message.c_str(), но зачем?

Answer 1

Вы как минимум не читали этот сайт - тут столько раз говорилось о том, как быть с такими не-POD объектами, что лично мне уже набило оскомину...

Вашим способом вы передаете не содержимое строк в вашем объекте, а их служебные поля. Строка содержит в себе указатель на выделенную где-то память, в которой содержатся интересующая вас информация. Но вы пытаетесь отправлять/получать просто эти указатели и другие служебные поля...

Получается примерно так - жена говорит собраться в отпуск и в машину в багажник сложить, ну, там, матрас надувной, палатку, мангал и шампуры - ну, в общем, барахло. Вы в багажник кладете бумажки с надписями "Матрас - на антресолях", "Палатка - на балконе" и т.д. Так вот передаете по сети (и, кстати, так же сохраняете в файл - это к тому, что точно по тем же причинам нельзя вот так же - через указатель - просто писать в файл)...

По приезду на место получаете/читаете (с сетью - даже не вы, а другой человек :), получивший вашу посылку) - вынимаете из бумажника бумажки с надписями, где что лежит. Но хуже того, что шкаф теперь совсем другой (если вообще есть - вы же на другом компьютере, в другой программе!), балкон тоже, так что втык от жены - это примерно и есть результат вот такого хранения и попытку раскрыть палатку, которой нет...

Что вам скажет жена/девушка, если вместо подарка вы ей вручите бумажку, на которой написано "красивое золотое кольцо"? :)

Именно поэтому передавать нужно не строку - объект string, а ее содержимое - те самые байты, указатель на которые получается с помощью .c_str(). И сначала длину - чтоб точно знать, сколько именно байт получать. А потом из этих данных восстанавливать нормальную строку-string...

READ ALSO
C++, динамическая компоновка

C++, динамическая компоновка

Есть динамическая библиотека(своя)Она использует другие библиотеки

214
Аналог JButton на SFML c++

Аналог JButton на SFML c++

Не могу понять каким образом в теории можно реализовать аналог JButton на SFML для моего небольшого проектаТак как для меню нужно много переключателей...

208
Использование template в C++

Использование template в C++

Всех приветствуюПытаюсь понять как использовать template в С++

214
В переменную записывается символ, а не строка

В переменную записывается символ, а не строка

ситуация следующая, в файле находится 3 словаii - переменная содержащая число 3 (good переменная типа fstream(если важно)), goods - string

185