· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.NETWORKS —› Как перенаправить tcp пакеты?

Посл.отвђт Сообщенiе


Дата: Апр 9, 2004 10:33:07

Есть огромное желание написать прогу, которая бы перенаправила бы сокеты обратно.
Я уже умею открыть порт и при соединении отправить определённою строку, но не знаю как при соединении клиента определить ип, и перенаправить трафик обратно к нему.

Был бы очень благодарен, еслиб Вы подсказали где я могу прочитать инфу про перенаправления сокетов.


Дата: Апр 9, 2004 12:23:09

Когда клент подключается к серверу (верней немного ранее) он у себя открывает какой нибудь случайный порт, и адресс свой и свой порт он посылает серверу. Сервер же подключив клиента уже знает и о адресе и об открытом порте в который надо слать клиенту. В какой структуре это передаётся так не помню, пошёл искать...


Дата: Апр 9, 2004 12:49:12

  int accept (s, addr, p_addrlen)
      int s;
      struct sockaddr_in *addr;
      int *p_addrlen;


Аргумент s задает дескриптор socket'а, через который программа-сервер получила запрос на соединение (посредством системного запроса listen).

Аргумент addr должен указывать на область памяти, размер которой позволял бы разместить в ней структуру данных, содержащую адрес socket'а программы-клиента, сделавшей запрос на соединение. Никакой инициализации этой области не требуется.

Аргумент p_addrlen должен указывать на область памяти в виде целого числа, задающего размер (в байтах) области памяти, указываемой аргументом addr.


Дата: Апр 9, 2004 13:51:13

JaDS
посмотри плизз..
.386
.model flat,stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\wsock32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\wsock32.lib
includelib \masm32\lib\advapi32.lib

WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD

.DATA      
ClassName db "xClass",0
AppName db "x",0
IconName db "Icon",0
wsadata WSADATA <>
sin sockaddr_in <>
WM_SOCKET equ WM_USER + 100

.DATA?
hInstance dd ?
CommandLine dd ?
sock dd ?
client dd ?
BufStr db 6666 dup (?)   ; Буфер приема
p_addrlen db 6666 dup (?)
Port dd ?

.CODE
start: 
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,hInstance,addr IconName
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,500,400,100,50,NULL,NULL,hInst,NULL
mov hwnd,eax

invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd

; --------------------------------------  Инициализация сокетных функций
invoke WSAStartup,101h,addr wsadata
invoke socket,AF_INET,SOCK_STREAM,0
mov sock,eax

invoke WSAAsyncSelect,sock,hwnd,WM_SOCKET,FD_ACCEPT+FD_READ+FD_CLOSE
mov sin.sin_family,AF_INET
mov Port,1111
invoke htons,Port
mov sin.sin_port,ax

mov sin.sin_addr,INADDR_ANY   ; Адрес - любой для сервера
invoke bind, sock,addr sin,sizeof sin   ; Связь адресов и порта с сервером
invoke listen,sock,SOMAXCONN
         
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp

; ---------------------------------------------------------------------- -------

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
       .IF uMsg == WM_CREATE
        .ELSEIF uMsg == WM_DESTROY
           invoke WSACleanup
           invoke PostQuitMessage,NULL
           
        .ELSEIF uMsg == WM_SOCKET
            mov eax,lParam
          .IF ax == FD_ACCEPT  ; Соединение
             shr ax,16
              .IF ax == NULL

       invoke accept,sock,addr BufStr,p_addrlen
       invoke struct, sockaddr_in *addr BufStr
       invoke *p_addrlen

        .ENDIF

     .ELSEIF ax == FD_READ   ;Реакция на получение данных от клиента
; Обнулим буфер для получения
            mov ecx,6666
            mov edi,offset BufStr
            lll: mov byte ptr [edi],0
            inc edi
            loop lll
            mov eax,wParam
            mov client,eax
            invoke recv,client,addr BufStr,sizeof BufStr,0   ; Получим данные в BufStr

                 .ELSEIF ax == FD_CLOSE
                        mov eax,wParam
                       invoke closesocket, eax
             .ENDIF
   .ELSEIF
                       invoke DefWindowProc,hWnd,uMsg,wParam,lParam
     ret
 .ENDIF
xor eax,eax
ret
WndProc endp
END start   


struct - не знаю как задать...


Дата: Апр 12, 2004 10:43:01

я весь код выложил чтоб всё понятно было. Помогите пожайлуста поравить только вот это :
       invoke accept,sock,addr BufStr,p_addrlen
       invoke struct, sockaddr_in *addr BufStr
       invoke *p_addrlen


Дата: Апр 12, 2004 13:25:29

Сорри в выходные доступа к инету небыло.

Чтото я не совсем понял что ты делаешь, а именно:
       invoke accept,sock,addr BufStr,p_addrlen
       invoke struct, sockaddr_in *addr BufStr
       invoke *p_addrlen

это глупость какая-то.
accept - эта функция "подключает" клиента. её надо вызывать если в очереди ктото уже есть (функция listen выполнилась)
sock - это тот сокет который ты создавал и на который ты принимаешь запрос на подключение.
addr BufStr - тут уже какая то фигня пошла, при чем тут текст?, у меня это объявленно так addr, по идее это адрес структуры sockaddr_in. Я прохо знаком с масмом, да и в асме я ещё сокеты не программировал, но вроде тебе надо добавить ещё одну переменную, примерно так
cl_addr sockaddr_in <>

p_addrlen - это адресс переменной/константы где храниться размер структуры sockaddr_in.

Теперь малясь справки:
Системный вызов accept извлекает из очереди, организованной системным вызовом listen, первый запрос на соединение и возвращает дескриптор нового (автоматически созданного) socket'а с теми же свойствами, что и socket, задаваемый аргументом s. Этот новый дескриптор необходимо использовать во всех последующих операциях обмена данными.
Насколько я понимаю дескрипотор этого нового сокета будет в eax, просто сохрани его, а потом используй для отправки сообщений клиенту.

PS:
сорри не могу в кодах показать, я на фасм подсел, да и не пробовал пока сокеты в асме, но думаю надо кое что написать. И вот ещё что, у тебя тут серьёзная концептуальная ошибка назревает, насколько я понял из твоего кода, ты созаёшь сервер к которому может подключиться один клиент. А потом понадобиться подключить второго... Помнится я с таким сталкивался, неприятно, очень.


Дата: Апр 12, 2004 15:59:40

JaDS
большое спасибо!
просто я сам токо-токо изучаю сокеты.


Дата: Апр 12, 2004 18:43:08

всё прекрасно работает.
.data? 
sock     dd      ? 
SockAddr sockaddr_in <> 

.code 
invoke accept,sock,addr SockAddr,sizeof sockaddr_in 
cmp eax, -1 

JaDS
подскажи плиз, как подвесить один сервак на несколько портов?
надо повторить этот код
invoke WSAStartup,101h,addr wsadata
invoke socket,AF_INET,SOCK_STREAM,0
mov sock,eax

invoke WSAAsyncSelect,sock,hwnd,WM_SOCKET,FD_ACCEPT+FD_READ+FD_CLOSE
mov sin.sin_family,AF_INET
mov Port,1111
invoke htons,Port
mov sin.sin_port,ax

mov sin.sin_addr,INADDR_ANY   ; Адрес - любой для сервера
invoke bind, sock,addr sin,sizeof sin   ; Связь адресов и порта с сервером
invoke listen,sock,SOMAXCONN

или есть способ по легче?


Дата: Сен 1, 2004 20:05:23

да и тредов туда с критическими секциями...


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.041