Форум » [x]Harbour » Передача файла через инет подсистему » Ответить

Передача файла через инет подсистему

Dima: Есть у кого примерчик ? PS я про Socket(ы)

Ответов - 15

alkresin: По какому протоколу, кто принимает?

Dima: я имел в виду передачу по локальной сети , принимать будет приложение на Андроиде (ну или допустим приложение под Виндой)

ММК: Dima пишет: Есть у кого примерчик ? PS я про Socket(ы) Не знаю поможет ли тебе :) в FWH есть с десяток примеров. Приблизительно так - function Client() oSocket = TSocket():New( 2000 ) oSocket:bRead = { | oSocket | MsgInfo( oSocket:GetData() ) } // Never use a MsgInfo() here because it hangs Windows!!! oSocket:bConnect = { || oWnd:SetText( "Connected!" ) } oSocket:bClose = { || MsgInfo( "Server has closed!" ) } oSocket:Connect( "127.0.0.1" ) // use the server IP address here return nil function SendFile() local cFileName := cGetFile( "*.*", "Select a file to send by Internet" ) if ! Empty( cFileName ) .and. File( cFileName ) oSocket:SendData( "SENDFILE " + cFileName( cFileName ) ) oSocket:SendFile( cFileName ) MsgInfo( "File sent" ) endif return nil


Dima: ММК Пасиб :) ММК пишет: SendFile() Это видимо что то типа hb_inetSendAll ...вероятно

PSP: Посмотри harbour\src\rtl\hbsockhb.c

alkresin: Примеров именно с hb_inet у меня нет, я его не использовал, но сделано это должно быть примерно так: на сервере - listen, accept, read, на клиенте - connect, write. Должен быть какой-то согласованный протокол, т.е., набор команд, которые посылает клиент и понимает сервер, ну типа той же SENDFILE из примера выше. Для синхронизации работы будет хорошо, если сервер будет посылать ответы на принятые команды. В принципе, в letodb или в guiserver - та же логика, тот же набор базовых функций, только вместо hb_inet другая библиотека.

ММК: Клиент - пример выше Вот пример с сервером - #include "FiveWin.ch" #define ST_COMMAND 1 #define ST_SENDFILE 2 #define FILE_BLOCK 8000 static oWnd, oSocket, oClient //------------------------------------------------------------------------// function Main() local oBar DEFINE WINDOW oWnd TITLE "Server socket" DEFINE BUTTONBAR oBar OF oWnd _3D DEFINE BUTTON OF oBar ACTION Server() TOOLTIP "Listen" DEFINE BUTTON OF oBar ACTION oClient:SendData( "Hello from server!" ) TOOLTIP "Talk to client" ACTIVATE WINDOW oWnd return nil //------------------------------------------------------------------------// function Server() oSocket = TSocket():New( 2000 ) oSocket:bAccept = { | oSocket | oClient := TSocket():Accept( oSocket:nSocket ),; oClient:Cargo := ST_COMMAND,; oClient:bRead := { | oSocket | OnRead( oSocket ) },; oClient:bClose := { | oSocket | OnClose( oSocket ) } } oSocket:Listen() return nil //------------------------------------------------------------------------// function OnRead( oSocket ) local cData := oSocket:GetData() local cToken LogFile( "sockserv.txt", { Len( cData ), cData } ) do case case oSocket:Cargo == ST_COMMAND cToken = StrToken( cData, 1 ) do case case cToken == "SENDFILE" oSocket:Cargo = ST_SENDFILE oSocket:hFile = fcreate( StrToken( cData, 2 ) ) case cToken == "MSG" MsgInfo( SubStr( cData, 5 ) ) endcase case oSocket:Cargo == ST_SENDFILE fwrite( oSocket:hFile, cData, Len( cData ) ) LogFile( "sockserv.txt", { "writting..." } ) if Len( cData ) < FILE_BLOCK // fclose( oSocket:hFile ) // MsgInfo( Len( cData ) ) // oSocket:Cargo = ST_COMMAND endif endcase return nil //------------------------------------------------------------------------// function OnClose( oSocket ) MsgInfo( "Client has closed!" ) do case case oSocket:Cargo == ST_SENDFILE fclose( oSocket:hFile ) endcase oSocket:End() return nil

Dima: PSP пишет: Посмотри harbour\src\rtl\hbsockhb.c Шибко сложно и не понятно где почитать... Клиента предварительно сделал , файлик передается (в виде строки разумеется) и кушается тестовым сервером. Обошелся только возможностями инет подсистемы что описаны в доке от Кресина.

PSP: Dima пишет: Шибко сложно и не понятно где почитать... Там функции-обёртки. Они уже включены в harbour /* * hb_socketGetError() --> nSocketError * hb_socketGetOSError() --> nOSError * hb_socketErrorString( [ nSocketErrror = hb_socketGetError() ], [ hSocket ] ) --> cError * hb_socketGetSockName( hSocket ) --> aAddr | NIL * hb_socketGetPeerName( hSocket ) --> aAddr | NIL * hb_socketOpen( [ nDomain = HB_SOCKET_AF_INET ], [ nType = HB_SOCKET_PT_STREAM ], [ nProtocol = 0 ] ) --> hSocket * hb_socketClose( hSocket ) --> lSuccess * hb_socketShutdown( hSocket, [ nMode = HB_SOCKET_SHUT_RDWR ] ) --> lSuccess * hb_socketBind( hSocket, aAddr ) --> lSuccess * hb_socketListen( hSocket, [ iQueueLen = 10 ] ) --> lSuccess * hb_socketAccept( hSocket, [ @aAddr ], [ nTimeout = FOREVER ] ) --> hConnectionSocket * hb_socketConnect( hSocket, aAddr, [ nTimeout = FOREVER ] ) --> lSuccess * hb_socketSend( hSocket, cBuffer, [ nLen = Len( cBuffer ) ], [ nFlags = 0 ], [ nTimeout = FOREVER ] ) --> nBytesSent * hb_socketSendTo( hSocket, cBuffer, [ nLen = Len( cBuffer ) ], [ nFlags = 0 ], aAddr, [ nTimeout = FOREVER ] ) --> nBytesSent * hb_socketRecv( hSocket, @cBuffer, [ nLen = Len( cBuffer ) ], [ nFlags = 0 ], [ nTimeout = FOREVER ] ) --> nBytesRecv * hb_socketRecvFrom( hSocket, @cBuffer, [ nLen = Len( cBuffer ) ], [ nFlags = 0 ], @aAddr, [ nTimeout = FOREVER ] ) --> nBytesRecv * hb_socketSetBlockingIO( hSocket, lValue ) --> nSuccess * hb_socketSetNoDelay( hSocket, lValue ) --> lSuccess * hb_socketSetExclusiveAddr( hSocket, lValue ) --> lSuccess * hb_socketSetReuseAddr( hSocket, lValue ) --> lSuccess * hb_socketSetKeepAlive( hSocket, lValue ) --> lSuccess * hb_socketSetBroadcast( hSocket, lValue ) --> lSuccess * hb_socketSetSndBufSize( hSocket, nValue ) --> lSuccess * hb_socketSetRcvBufSize( hSocket, nValue ) --> lSuccess * hb_socketGetSndBufSize( hSocket, @nValue ) --> lSuccess * hb_socketGetRcvBufSize( hSocket, @nValue ) --> lSuccess * hb_socketSetMulticast( hSocket, [ nFamily = HB_SOCKET_AF_INET ], cAddr ) --> lSuccess * hb_socketSelectRead( hSocket, [ nTimeout = FOREVER ] ) --> nRet * hb_socketSelectWrite( hSocket, [ nTimeout = FOREVER ] ) --> nRet * hb_socketSelectWriteEx( hSocket, [ nTimeout = FOREVER ] ) --> nRet * hb_socketSelect( aRead, lSetRead, aWrite, lSetWrite, aExcep, lSetExcep, [ nTimeout = FOREVER ] ) --> nRet * hb_socketResolveINetAddr( cAddr, nPort ) --> aAddr | NIL * hb_socketResolveAddr( cAddr, [ nFamily = HB_SOCKET_AF_INET ] ) --> cResolved * hb_socketGetHostName( aAddr ) --> cHostName * hb_socketGetHosts( cAddr, [ nFamily = HB_SOCKET_AF_INET ] ) --> aHosts * hb_socketGetIFaces( [ nFamily ], [ lNoAliases ] ) --> aIfaces * hb_socketGetFD( hSocket ) --> nFD * hb_socketSetFilter( hSocket, cFilterName, [ hSockParams ] ) --> hSocket * hb_socketGetFilter( hSocket ) --> cFilterName * hb_socketRead( hSocket, @cBuffer, [ nLen = Len( cBuffer ) ], [ nTimeout = FOREVER ] ) --> nBytesRead * hb_socketWrite( hSocket, cBuffer, [ nLen = Len( cBuffer ) ], [ nTimeout = FOREVER ] ) --> nBytesWritten * hb_socketFlush( hSocket, [ nTimeout = FOREVER ], [ lSync ] ) --> nBytesLeft * hb_socketAutoFlush( hSocket, [ nNewSetting ] ) --> nPrevSetting * hb_socketAutoShutdown( hSocket, [ lNewSetting ] ) --> lPrevSetting */ Может тоже пригодится.

Dima: PSP пишет: Может тоже пригодится. Это понятно. Назначение функций мне не понятно , примеров нет , кроме того надо знать как работать корректно с сокетами. Можно конечно методом тыка , но это будет долго и с не понятным результатом. Не думаю что достаточно тех 3-х функций что ты выделил , хотелось бы корректно решить задачу а не абы как Спасибо за желание помочь !

PSP: Не за что. Помощи как таковой и не было)) А можешь показать, чем ты решил?

Dima: PSP Примерно так [pre2] #translate CRLF => hb_OsNewLine() local aHeader local cip local nport REQUEST HB_CODEPAGE_RU866 hb_cdpSelect( "RU866" ) setmode(25,80) iniret:=IniLoad() if hb_HHasKey(iniret,'SETTINGS') aHeader := iniret['SETTINGS'] nport:=val(aHeader['PORT']) cip:=aHeader['HOST'] endif SendFileInet("1.pdf",cip,nport,"RN") ******************** Func SendFileInet(Cfile,Chost,Nport,cp) local cstr local ret:=.t. local hSocket local nret:=0 cls if !hb_fileexists(cfile) return .f. endif cstr:=HB_BASE64ENCODE(hb_memoread(cfile)) if len(cstr)==0 return .f. endif hb_inetInit() hSocket := hb_inetCreate(2000) hb_inetConnect( Chost,nport,hSocket ) if hb_inetErrorCode( hSocket )#0 return .f. endif do while .t. nret:=hb_inetSendAll( hSocket, "["+cp+"]"+CRLF) if nret==0 .or. nret==-1 ret:=.f. exit endif devpos(i++,0) devout( hb_inetRecvLine(hSocket) ,"g+/n") *************** nret:=hb_inetSendAll( hSocket, "[FileName="+hb_FNameNameExt(cfile)+"]"+CRLF) if nret==0 .or. nret==-1 ret:=.f. exit endif nret:=hb_inetSendAll( hSocket, cstr+CRLF) if nret==0 .or. nret==-1 ret:=.f. exit endif nret:=hb_inetSendAll( hSocket, "[\"+cp+"]"+CRLF) if nret==0 .or. nret==-1 ret:=.f. exit endif nret:=hb_inetSendAll( hSocket, "quit"+CRLF) if nret==0 .or. nret==-1 ret:=.f. exit endif //devpos(i++,0) //devout( hb_inetRecvLine(hSocket) ,"bg/n") hb_inetClose(hSocket) exit enddo hb_inetCleanup() return ret ************** Func IniLoad() LOCAL hIni := hb_Hash() local ret if !hb_fileexists("Test.INI") hIni["SETTINGS"] := hb_Hash() hIni["SETTINGS"]["HOST"] :="127.0.0.1" hIni["SETTINGS"]["PORT"] :="2000" HB_IniWRIte( "TEST.INI", hIni) endif ret := hb_IniRead("TEST.INI" ) return ret [/pre2]

Dima: Заработала связь с андроид однако :)

PSP: Поделишься?))

Dima: PSP пишет: Поделишься?)) Чем ? Пример "клиента" я выложил. Задачу на Андроид писал не я.



полная версия страницы