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