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

 WASM Phorum —› WASM.NETWORKS —› sock-proxy

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


Дата: Май 6, 2004 11:19:45

Здравствуйте.
Помогите пожайлуста грамотно и правильно передать данные от клиента к удалённому хосту...
Мои действия:
При соединении client'a:
1. конектится с удалённым хостом, если не возвращает SOCKET_ERROR, идём дальше...
2. принимаем данные:
invoke recv, client, addr Bufpriem, 15000, 0
mov eax, 1
mov dannie, eax
3. invoke send, socka, addr Bufotpravic, addr dannie, 1

Правильно-ли это, если да, что дальше сделать.. ?
уйти в invoke Sleep, 50 и ждать... ?

Посиба за внимание.


Дата: Май 6, 2004 19:03:40

Flasher
invoke send, socka, addr Bufotpravic, addr dannie, 1
3й параметр содержит количество байт в буфере, а не адрес. Надо так:
invoke send, socka, addr Bufotpravic, 1, 1 


Дата: Май 6, 2004 21:08:46

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


Дата: Май 6, 2004 22:00:02

Flasher
recv возвращает количество принятых байт.


Дата: Май 7, 2004 19:46:12

mov ecx,16384
mov edi,offset BufPriem
lll: mov byte ptr [edi],0
inc edi
loop lll

invoke recv,client,offset BufPriem,sizeof BufPriem,0
.IF eax == SOCKET_ERROR
invoke recv,client,offset BufPriem,sizeof BufPriem,0
.ENDIF

invoke send,socka,offset BufPriem,sizeof BufOtpravic,1

invoke Sleep,10

Праильно-вить делаю?


Дата: Май 7, 2004 21:28:09

Если коннект упал, то повторный приём вернёт ещё один SOCKET_ERROR :-)

Вместо sizeof BufOtpravic нужно передавать количество принятых байт (это значение лежит в EAX):

invoke send,socka,offset BufPriem,eax,1

А зачем тут Sleep?


Дата: Май 8, 2004 14:09:17

тоесть SOCKET_ERROR не нуно использовать при приёме?
Sleep - для того, чтоб спал :)
Quantum, thenx, теперь могу передать данные с одного хоста к другому...

но что дальше делать?
получить данные от socka и отправить client'у?
пробовал вот так(но нечего не выходит):
invoke recv,socka,offset Buf2Priem,sizeof Buf2Priem,0
invoke send,client,offset Buf2Priem,eax,1


Дата: Май 17, 2004 16:22:26

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

.486
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\user32.inc
include \masm32\include\advapi32.inc
include \masm32\include\masm32.inc
include \masm32\include\wsock32.inc
include \masm32\include\netapi32.inc

includelib \masm32\lib\wsock32.lib
includelib \masm32\lib\advapi32.lib
includelib \masm32\lib\netapi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\masm32.lib

Recv21 proto
Send21 proto
ConnPort21 proto

.data
AdressIP db '192.168.0.0',0 ; <- IP хоста
wsadata WSADATA <?>

.data?
clientftp dd ?
sockftp dd ?
sockaftp dd ?
BufSend21 dd ?
BufRecv21 dd ?
BufBindPortftp dd ?
BufPriemftp db 16384 dup (?)
Buf2Priemftp db 16384 dup (?)
ftp sockaddr_in <?>

.code
start:
invoke ConnPort21
invoke ExitProcess, 0

ConnPort21 proc
invoke WSAStartup,101h,addr wsadata
invoke socket,AF_INET,SOCK_STREAM,IPPROTO_IP
mov sockftp,eax
invoke htons, 21 ; <- Порт сервера
mov ftp.sin_port, ax
mov ftp.sin_family, AF_INET
mov ftp.sin_addr, INADDR_ANY
invoke bind, sockftp,addr ftp,sizeof ftp
invoke listen,sockftp,SOMAXCONN
__AcceptConn:
xor eax, eax
invoke accept, sockftp, 0, 0
cmp eax,-1
jz short __AcceptConn
test eax, eax
jz __NoConn
mov clientftp, eax

; соединяемся с хостом..
invoke socket,AF_INET,SOCK_STREAM,IPPROTO_IP
mov sockaftp,eax
invoke htons, 21 ; <- Порт хоста
mov ftp.sin_port, ax
mov ftp.sin_family, AF_INET
invoke inet_addr, addr AdressIP ; <- IP хоста
mov ftp.sin_addr, eax
invoke connect, sockaftp, addr ftp, sizeof ftp
.if eax == SOCKET_ERROR
invoke send,clientftp,offset SOCKET_ERROR,sizeof SOCKET_ERROR,0
invoke closesocket,sockaftp
invoke closesocket,clientftp
jmp __AcceptConn
.endif

invoke CreateThread,NULL,0,OFFSET Send21,NULL,0,OFFSET BufSend21
invoke CreateThread,NULL,0,OFFSET Recv21,NULL,0,OFFSET BufRecv21

__Sleep:
invoke Sleep,10
jmp __AcceptConn
__NoConn:
invoke shutdown,clientftp,3
invoke shutdown,sockaftp,3
jmp __AcceptConn
ret
ConnPort21 endp

Send21 proc
@@Send:
mov ecx,16384
mov edi,offset BufPriemftp
lll: mov byte ptr [edi],0
inc edi
loop lll

invoke recv,clientftp,offset BufPriemftp,sizeof BufPriemftp,0
test eax, eax
jz __EndConn
invoke send,sockaftp,offset BufPriemftp,eax,0
cmp eax,SOCKET_ERROR
jz __EndConn
test eax, eax
jz __EndConn
jmp @@Send
__EndConn:
invoke closesocket, sockaftp
invoke closesocket, clientftp
invoke ExitThread,0
ret
Send21 endp

Recv21 proc
@@Recv:
mov ecx,16384
mov edi,offset Buf2Priemftp
lll: mov byte ptr [edi],0
inc edi
loop lll

invoke recv,sockaftp,offset Buf2Priemftp,sizeof Buf2Priemftp,0
test eax, eax
jz __EndConn
invoke send,clientftp,offset Buf2Priemftp,eax,0
cmp eax,SOCKET_ERROR
jz __EndConn
test eax, eax
jz __EndConn
jmp @@Recv
__EndConn:
invoke closesocket, sockaftp
invoke closesocket, clientftp
invoke ExitThread,0
ret
Recv21 endp
end start


Дата: Май 17, 2004 22:02:22

invoke htons, 21 ; <- Порт сервера
mov ftp.sin_port, ax

Можно заменить на mov ftp.sin_port,1500h

__AcceptConn:
xor eax, eax
invoke accept, sockftp, 0, 0

Зачем тут xor eax,eax?

invoke CreateThread,NULL,0,OFFSET Send21,NULL,0,OFFSET BufSend21
invoke CreateThread,NULL,0,OFFSET Recv21,NULL,0,OFFSET BufRecv21

Где CloseHandle?

invoke ExitThread,0
ret

ExitThread не нужен.

ЗЫ: Опять эта Sleep. Так зачем ему спать?


Дата: Май 18, 2004 11:02:56

>Зачем тут xor eax,eax?
не наю :) в каком-то коде видел, вот и подумал пусть у меня тож будет :)

>Где CloseHandle?
а зачем CloseHandle, яж ни хочу закрыть поток, поток автоматом закрывается из нутры через ExitThread, кода ошибка или кода данные не поступают.

Quantum, ну нравится мне спать.., ничего не могу с собой поделать :))

Quantum, соглосись-вить, давольно хорошо работает?


Дата: Май 18, 2004 19:43:41

Flasher
а зачем CloseHandle, яж ни хочу закрыть поток, поток автоматом закрывается из нутры через ExitThread, кода ошибка или кода данные не поступают.
Марш к Iczelion'у!

ну нравится мне спать.., ничего не могу с собой поделать :))
Ну, так accept всё-равно не вернёт управление пока клиент не приконнектиться! Не нужен там Sleep.


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