Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2012, 21:01   #1
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию WinSock Recv

Попробовал тут как-то перегнать на асм код Криса для создания TCP сервера на WinSock. До вменяемой рабочей версии допилил, но в процессе возник вопрос, порожденный цитатой на одном форуме:

Цитата:
В случае блокирующих сокетов, Recv примет данные всегда за один вызов.
Хотя до этого кучу раз слышал, что необходимо самому контролировать процесс склейки\разбивки данных. Решил попробовать.

Код:
    .REPEAT
        INVOKE RtlZeroMemory, addr BufStr, sizeof BufStr 
        INVOKE recv, Sock, addr BufStr, sizeof BufStr,0
        MOV Bytes, EAX
        .IF (EAX)
            INVOKE MessageBox, 0, addr BufStr,0,0
        .ENDIF
    .UNTIL (!Bytes)
В итоге такая конструкция всегда выводила сообщение целиком(даже большое и даже на плохих каналах связи).

А вопрос, собственно, в следующем: неужели на блокирующих сокетах recv получает всё сообщение разом?
hiho вне форума Ответить с цитированием
Старый 17.03.2012, 23:05   #2
Rock-n-Rolla
Форумчанин
 
Регистрация: 11.01.2012
Сообщений: 177
По умолчанию

подсистема сокетов ждёт когда пакет придёт полностью и только потом передаёт пакет функции recv
progromore.i2p - первый русскоязычный портал программистов в скрытосети

Последний раз редактировалось Rock-n-Rolla; 17.03.2012 в 23:07.
Rock-n-Rolla вне форума Ответить с цитированием
Старый 17.03.2012, 23:26   #3
hiho
Форумчанин
 
Регистрация: 29.04.2008
Сообщений: 100
По умолчанию

Цитата:
Сообщение от Rock-n-Rolla Посмотреть сообщение
подсистема сокетов ждёт когда пакет придёт полностью и только потом передаёт пакет функции recv
Про пакет я знаю, я про всё сообщение целиком, ведь через TCP данные передаются потоком, то есть могут быть разбиты(склеены) в любом порядке, что означает что сообщение, посланное за один вызов Send, вполне может быть принято за несколько вызовов Recv и наоборот. Но для блокирующих сокетов мне такое поймать не удалось.
hiho вне форума Ответить с цитированием
Старый 18.03.2012, 02:47   #4
litrovith
Пользователь
 
Регистрация: 15.07.2008
Сообщений: 28
По умолчанию

hiho, во-вторых - RtlZeroMemory лишнее, т.к. recv отдаёт кол-во полученых байт, во-первых, если нехватает мазохизма, установите размер BufStr в пару байт, и посмотрите на результат.
litrovith вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
recv socket cppn00b Visual C++ 5 03.04.2011 15:19
recv Function Dimarik Win Api 2 04.04.2010 11:53
Функция recv (Winsock) YYYYY Работа с сетью в Delphi 0 18.02.2010 02:16
recv() Артэс C/C++ Сетевое программирование 7 15.01.2010 14:51
WinSock (send, recv) AidarBik Работа с сетью в Delphi 1 27.07.2008 15:22