Как указать в сокетах через какой адаптер работать?

Тема в разделе "WASM.NETWORKS", создана пользователем Flasher, 30 сен 2007.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Есть две сетевухи.
    При connect'е надо указать через какой адаптер надо выходить в сеть.
    И это не в своей программе, а в чужом клиенте.
    Сделал так: в начале bind с указанным ипом, а потом этот-же сокет юзать при канекте.
    Вроде-бы даже прокатило, программа канектится через указанный ип, но дальше ничего не происходит..., и это со всеми программами.
    вот хукнутый connect :)
    Код (Text):
    1. NewFunction21 proc
    2.        mov _ecx21,ecx
    3.        mov _ebx21,ebx
    4.        mov _esi21,esi
    5.        mov _edi21,edi
    6.        cld
    7.        mov ecx,6
    8.        mov esi,offset _jmp21
    9.        mov edi,func21
    10.        rep movsb
    11.        
    12.        push ebp
    13.        mov ebp,esp
    14.  
    15.        invoke inet_addr,$CTA0("172.20.1.11")
    16.        mov sin.sin_addr,eax
    17.        mov sin.sin_family,02h
    18.        mov sin.sin_port,0
    19.        invoke socket,02h,01h,00h
    20.        mov ebx,eax
    21.        invoke bind,ebx,addr sin,16
    22.  
    23.        sock equ dword ptr [ebp+8] ;1
    24.        push ebx
    25.        pop sock
    26.  
    27.        leave
    28.        mov eax,[esp]
    29.        mov word21,dword ptr eax
    30.        pop ebx
    31.        call func21
    32.        push word21
    33.        
    34.        cld
    35.        mov ecx,6
    36.        mov esi,offset _pmj21
    37.        mov edi,func21
    38.        rep movsb
    39.        mov ecx,_ecx21
    40.        mov ebx,_ebx21
    41.        mov esi,_esi21
    42.        mov edi,_edi21
    43.        ret
    44. NewFunction21 endp
    Когда я юзаю свой сокет, его сокет становится непригодным, поэтому и такая проблема?
    И ещё вопрос, мож-но ли решить эту задачу другим методом? Не через bind.
     
  2. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    Я не совсем понял твой вопрос, но чтобы узнать локальный адрес сетвухи используется:
    Код (Text):
    1. invoke getsockname,HendlConnect,addr sin,addr sizeofsin
    2.         mov eax,sin.sin_addr.S_un.S_addr
    для удаленного:
    Код (Text):
    1. invoke getpeername,HendlConnect,addr sin,addr sizeofsin
    2.         mov eax,sin.sin_addr.S_un.S_addr
    В регистре eax получишь искомое
    Надеюсь это тебе поможет.
     
  3. al79

    al79 Алексей

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    133
    Адрес:
    Екатеринбург
    Если у тебя сетевые включены к сети с разными масками, то WIN-да сама определит по IP через какую сетевую работать, но вот если маски одинаковые то пакеты будут отправляться в обе сетевые и там уже завист какая сетевая карта получит первой ответ.