|
|
| Посл.отвђт | Сообщен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 |