Сейчас на форуме: jinoweb, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Вопрос по сокета
Посл.ответ Сообщение

Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 12 сентября 2016 10:56
· Личное сообщение · #1

Всем привет.
Есть непонимание почему происходит следующее:
1. Есть вэб-сервер (банальный апач, но это не важно). Он нормально пингуется.
2. Есть дллка которая грузиться руками и из которой происходит взаимодействие с этим серверорм.
3. На Вин 8+ (вне зависимости от разряности все хоккей). На Вин 7 - то работает то не (то есть коннект, то нет, то шлет то нет, то тянет данные то нет).

Код тривиален. Есть неблокирующий сокет и для ожидания используется селект.
Пример (кусок коннекта, сенд ресив по такой же аналогии)

invoke connect, lpSocket, lpName, dwNameLen
mov RetStatus, eax
invoke WSAGetLastError

.if RetStatus == SOCKET_ERROR && eax == WSAEWOULDBLOCK
FDZERO fdWrite
FDZERO fdErr
FDSET lpSocket, fdWrite
FDSET lpSocket, fdErr

m2m Timeout.tv_sec, dwTimeout
m2m Timeout.tv_usec, 0

invoke select, 0, 0, addr fdWrite, addr fdErr, addr Timeout
.if eax != 0
invoke __WSAFDIsSet, lpSocket, addr fdWrite
.if eax != 0
m2m RetStatus, 0
.endif

invoke __WSAFDIsSet, lpSocket, addr fdErr
.if eax != 0
m2m RetStatus, SOCKET_ERROR
.endif
.endif
.endif

select - вываливается с 0 (timeout) что крайне странно.
Причем если тот же код вынести в exe/dll и дергать гетпрок или просто через линковку (те в exe в импорте будут) - то везде ок.

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



Ранг: 4.0 (гость), 7thx
Активность: 0=0
Статус: Участник

Создано: 12 сентября 2016 16:21
· Личное сообщение · #2

там же NULL должен быть указатель на timeout для select , чтобы он встал в ожидание?
я не знаю что это за язык, и воспринимает ли он 0 как NULL, но может есть возможность вместо timeout написать просто NULL и попробовать?



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 12 сентября 2016 16:25
· Личное сообщение · #3

Williams
Эм... это ассемблер. Остальное не распарсил) чтобы встал на ожидание должен быть передан ук-ль на структуру, что присутствует. Все по мсдн.




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 12 сентября 2016 22:28
· Личное сообщение · #4

--> Link <--

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube


| Сообщение посчитали полезным: plutos

Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2016 10:12
· Личное сообщение · #5

mak
все это прочитано. если бы гугл знал, я бы сюда не отписал. правила форума я читал.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 сентября 2016 10:28
· Личное сообщение · #6

таймаут коннекта истек, оно не смогло соедениться
проблема видимо не в коде а в политиках виндовс, фаервол итд



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2016 11:14
· Личное сообщение · #7

reversecode
thnx, думал об этом. но как-то не придумал как может влиять.
еще момент. воспроизводся так - без впн работает, с впн нет, но браузеры тянут ок. wget тоже. если задержка то секунда может. тоже не думаю что код, так как все по мсдн в плане кода.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 сентября 2016 11:23 · Поправил: reversecode
· Личное сообщение · #8

тот же процесс хакер показывает что происходит с тцп коннектами
можно поиграться с ваершарком на локальной машине по интерфейсу
проблема может быть и с той стороны на впн сервере, банальный tcp mss fix, хотя он и проявляется по другому,
но а вдруг



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2016 11:28
· Личное сообщение · #9

reversecode
в ваершарке вижу норм тсп хэндшейк без впн, с впном его не увидишь - там все в туннель заворачивается. возможно ты и прав что дропаются какие-то пакеты. но черт побери как вгет то тянет без проблем...




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 сентября 2016 11:35
· Личное сообщение · #10

ваершарк разве интерфеса тунеля не видит ? до того как оно в тунель заходит ?

вгет конектится и тянет с того же айпи что и длл ? тогда вам и карты в руки
возможно там какая то опция на сокете стоит

Добавлено спустя 0 минут
а может таймаут маленький на селекте ?
ну вообщем все карты у вас



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2016 11:43 · Поправил: superakira
· Личное сообщение · #11

reversecode
видит что в туннел летит) на разделить проблемотично.
по вгету - именно так, с той же машины, но впном тянет норм. какая опция сокета может на это влиять - ума не приложу.

На селекте для коннекта 10 секунда, для сенда 20, для ресива 30 =) я не скупился

Добавлено спустя 4 минуты
И еще напомню, что писал выше
Причем если тот же код вынести в exe/dll и дергать гетпрок или просто через линковку (те в exe в импорте будут) - то везде ок.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 сентября 2016 11:50
· Личное сообщение · #12

tcp no delay например итд
там их хватает

еще может быть bind перед коннектом для того что бы пакеты уходили с определенного айпи(интерфейса)
а не со случайного если bind сделать на 0.0.0.0

хотя если ваш код скопилить не как длл а как екзе вы говорите все начинает нормально работать ? странно вообщем

Добавлено спустя 1 минуту
а если цгет скомпилить в длл и вынести в гет прок и дергать ?)))



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2016 11:56
· Личное сообщение · #13

reversecode
на счет вгет - не вариант, но хотелось бы. В процессе ничего не биндиться, только шлеться (связка коннект-сенд-ресив-дисконнект). было бы не странно - я бы не писал)
еще вопрос - может ли как-то влиять то что длл загружена руками?

Добавлено спустя 0 минут
на счет флагов попробую.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 сентября 2016 11:57
· Личное сообщение · #14

то что не биндится неправильно, сбиндите перед коннектом на какой то айпи
а то может у вас там интерфейсов много и оно уходит с какого то левого плутая ?

может загруженная руками получает меньше прав ? я в политиках винды не особо



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2016 12:04
· Личное сообщение · #15

О_о я просто всегда думал, что бинд для серверной части и не где не читал, что могут быть такие наводки




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 сентября 2016 12:08
· Личное сообщение · #16

бинд говорит с какого айпи будут уходить пакеты
если бинда нет то с первого доступного интерфейса
если у вас их много(интерфейсов), то пакет может уходить не оттуда откуда ожидается

Добавлено спустя 3 минуты
таблицы роутинга в принципе все это поправляют, но бывают ситуации



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2016 12:13 · Поправил: superakira
· Личное сообщение · #17

гуглю читаю, но грех не спросить - как лучше биндить? 0.0.0.0 или свой ип? какой порт - по идее без конфликтов же надо.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 сентября 2016 12:17
· Личное сообщение · #18

чувствую посоветовал глупость,
интерфейс у вас один ? тогда нет смысла биндить



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2016 12:20 · Поправил: superakira
· Личное сообщение · #19

на виртуалке их несколько + впн. все равно проверю. варианты то уже почти все перебрал




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 сентября 2016 12:23
· Личное сообщение · #20

ну почему почти все, еще остается сбилдить вгет и запихать в длл



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2016 12:25
· Личное сообщение · #21

размер. он критичен. так бы я на асио все написал и не парился.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 сентября 2016 12:26
· Личное сообщение · #22

сейчас важен не размер а проблема которая связана с тем что это в длл, если и вгет нагнется в длл
что тогда делать ?



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2016 12:33 · Поправил: superakira
· Личное сообщение · #23

думаешь надо прикрутить вгет код? ну честно говоря я уже все перепробовал и мне не кажется это странной идеей)

Добавлено спустя 1 минуту
посмотрел вайршарком. исходящий интерфейс всегда одинаков (с впн и без до проваливания в туннель) - так что по идее бинд не нужен.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 14 сентября 2016 12:36 · Поправил: reversecode
· Личное сообщение · #24

есть вгет оспаривать корректность которого смысла нет, так ?
значит если он не будет работать в длл,значит какая то политика винды
если будет работать в длл, значит копать дальше код



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 14 сентября 2016 12:40
· Личное сообщение · #25

стянул код вгета. читаю. думаю ты прав, спасибо. отпишу результат - чтоб потомкам было проще)



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 15 сентября 2016 16:52
· Личное сообщение · #26

reversecode
забавно, но код вгета отработал. я не оформлял в виде длл или либы, просто рипнул код котрый мне был нужен. там просто написано. перегнал в асм и прикрутил к себе. все хоккей. они работают с блокирующими сокетами и по хитрому обрабатывают коннект (в отдельном потоке), сенд ресив на селектах (но чуть по другому). в общем кто бы мог подумать, что с неблокирующими такой плавающий баг. и это поведение только на 7. на 8+ все хоккей. такие дела.




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 15 сентября 2016 17:08 · Поправил: reversecode
· Личное сообщение · #27

кода мы не видели, поэтому верим наслово
очевидно в нем недоработки, просто разные потоки, ничего нового привнести не могли
да и если бы на винде 7 были такие глюки, они бы уже стали всем известны



Ранг: 7.1 (гость)
Активность: 0.020
Статус: Участник

Создано: 15 сентября 2016 17:21
· Личное сообщение · #28

reversecode
да он простой как 5 копеек. запостить код не могу =( но в любом случае спасибо.


 eXeL@B —› Программирование —› Вопрос по сокета
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати