вот некоторые указатели
вам нужно делать одни и те же шаги как при написании, так и при чтении
, например, сначала записать длину (число байтов) строки в сокете, iугадайте в вашем случае одного байта должно быть достаточно для описания длины, после этого запишите строку в виде серии байтов.Если вы хотите иметь большие строки, используйте тип данных для длины, которая хорошо определена, а не int
, например, сделайте свой собственный тип и имейте в виду, что если вы общаетесь между платформами, вам может потребоваться учитывать endianness .
то, что у вас есть на стороне записи, кажется нормальным (я полагаю, вы пропустили открытие / переплет и т.д. сокетов):
write(client_sock, &len, sizeof(unsigned char));
write(client_sock, str, len);
на стороне получателя высначала прочитайте длину, а затем это число следующих байтов:
read(client_sock, &len, sizeof(unsigned char));
char* buffer = new char[len + 1]; // create a buffer
read(client_sock, buffer, len);
buffer[len]='\0'; // terminate the string
теперь вы получили строку в буфере, просто преобразуйте ее в std :: string.
std::string s = buffer;
delete [] buffer;
[заявление об отказе: не предназначено для полного или компилируемого кода для демонстрации принципа]
это неверные утверждения:
char buf[sizeof(len)];
sscanf(buf, "%s", &str);
buf неинициализирован и слишком мал, поскольку sizeof(len)
будетверните размер только int
, и вы практически читаете из неинициализированного буфера в строку, в которой есть место для одного байта.здесь нет необходимости в sscanf.