Как извлечь информацию о длине сообщения и извлечь только столько сообщений из потока байтов TCP?
Я пытаюсь отправить сообщение через сокет в C ++. Я прочитал много вопросов о переполнении стека, связанных с этим, но все еще не мог понять, как это работает. Допустим, я отправляю следующие символы (M, a, r, t, i, n) на локальный хост-сервер. Люди предполагают, что в качестве длины можно использовать 4 байта (т.е. 32 бита, чтобы он мог обрабатывать сообщение до до 4 ГБ длины).
Я сделал то же самое на стороне клиента, но все еще не знаю, как я могу выяснить это на стороне сервера, хочу ли я получать только начальные 3 байта (M, a, r) или последние 3 байта (t, i, n) из моих данных.
Я публикую свой код, пожалуйста, помогите мне в основном на стороне сервера, буду благодарен, если сможете написать несколько строк, имеющих отношение к коду.
Client side code
std::vector<char> userbuffer(20);
std::cout<<"\nclient:"<<std::endl;
char* p = userbuffer.data();
*p = 'M';
++p; *p = 'a';
++p; *p = 'r';
++p; *p = 't';
++p; *p = 'i';
++p; *p = 'n';
size_t length = strlen(userbuffer.data());
uint32_t nlength = htonl(length);
//line containg message length information
int header_info = send(socketFD, (char*)&nlength, 4, 0);
// Data bytes send to the server
int bytes_sent = send(socketFD, userbuffer.data(), length, 0);
if(bytes_sent == SOCKET_ERROR){ //some errror handling}
Server Side Code
char receivebuffer[MAX_DATA] = { '\0' };
int bytesReceivedFromClientMsg = 1;
int length_bytes = 0;
uint32_t length, nlength;
//code to check length if we have received whole data length
while(length_bytes < 4){
int read = recv(clientSocket, ((char*)&nlength)+length_bytes, (4-length_bytes), 0);
if (read == -1) { //error handling}
length_bytes += read;}
// Most painfull section to understand.
// I implemented this code from some ideas on internet
//but still cant find how its extracting length and what i am reading :(
while(bytesReceivedFromClientMsg > 0){
int msgheader = recv(clientSocket,(char*)&nlength,6, 0);
length = ntohl(nlength);//leng value here is in severel thousand size
char *receivebuffer = new char(length+1);
bytesReceivedFromClientMsg = recv(clientSocket, receivebuffer, msgheader, 0);
receivebuffer[length] = 0 ;
std::cout<<"msg header is :"<<msgheader<<std::endl;
std::cout<<"msg data is :"<<bytesReceivedFromClientMsg<<std::endl;
if(bytesReceivedFromClientMsg == SOCKET_ERROR){//some error handling}