Задать вопрос
@sddvxd

Почему send позволяет отправлять little-endian данные?

Добрый день!
Пытаюсь разобраться - почему, если указано, что сеть работает только сетевым порядком байтов (big-endian), а у меня на компьютере little-endian кодировка, тогда почему успешно работает код такого вида?

const char* request = "GET / HTTP/1.1\r\n\Host: site.ru\r\n\r\n";
//... creating socket and connection ...
send(socket, request, lenData, 0);
recv(socket, buffer, 1024*10, 0); //code 200 [OK]


Почему это нормально работает? Потому, что когда я пытаюсь таким же образом получить данные с сервера с помощью насма - сервер меня не понимает:

msgRequest db "GET / HTTP/1.1\r\n\Host: site.ru\r\n\r\n"
lenMsgRequest $-msgRequest
; ... creating socket and connection ...
    push 0
	push lenMsgRequest
	push msgRequest
	push dword [socket]
	call _send@16
	cmp eax, -1
	je error
	
	push 0
	push 8128
	push buffer
	push dword [socket]
	call _recv@16 //code 400 [Bad Request]
  • Вопрос задан
  • 202 просмотра
Подписаться 1 Простой 6 комментариев
Пригласить эксперта
Ответы на вопрос 1
Понятие big endian и little endian есть у многобайтных типов фиксированной длины (обычно целочисленных) в адресном пространстве. В сети нет адресации данных, поэтому нет понятия big endian и little endian, есть понятие прямого и обратного сетевого порядка байт.
Функции send/recv оперируют не с многобайтными целыми числами, а с буфером памяти произвольной длины и ничего не знают о том, какие именно данные в этих буферах находятся и о представлении хранящихся в них целочисленных данных, если таковые там есть. Поэтому данные по сети будут отправлены в том порядке, в котором они находятся в адресном пространстве в отправляемом буфере.

Однако, в привиденном вами фрагменте кода нет передачи челочисленных данных по сети, поэтому ваш вопрос в принципе не корректен. Ваши проблемы скорей всего в том, что вы отправляете лишние данные после текстовой строки, т.к. неправильно вычисляете количество символов в ней либо неправильно кладете в стек целочисленную переменную, без учета ее размера (например, там должно быть 64-битное число, а вы кладете только 32 бита).

P.S. а вообще у вас там лишний бекслеш перед H в текстовой константе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы