Автор | Сообщение |
|
| |
Пост N: 7007
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.02.19 17:01. Заголовок: Передача файла через инет подсистему
Есть у кого примерчик ? PS я про Socket(ы)
|
|
|
Ответов - 15
[только новые]
|
|
|
| moderator
|
Пост N: 1161
Зарегистрирован: 06.07.06
|
|
Отправлено: 01.02.19 17:18. Заголовок: По какому протоколу,..
По какому протоколу, кто принимает?
|
|
|
|
| |
Пост N: 7008
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.02.19 17:31. Заголовок: я имел в виду переда..
я имел в виду передачу по локальной сети , принимать будет приложение на Андроиде (ну или допустим приложение под Виндой)
|
|
|
|
| постоянный участник
|
Пост N: 348
Зарегистрирован: 29.05.10
|
|
Отправлено: 01.02.19 19:08. Заголовок: 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
|
|
|
|
| |
Пост N: 7009
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.02.19 22:08. Заголовок: ММК Пасиб :) ММК пи..
ММК Пасиб :) ММК пишет: Это видимо что то типа hb_inetSendAll ...вероятно
|
|
|
|
| постоянный участник
|
Пост N: 1497
Зарегистрирован: 27.01.07
|
|
Отправлено: 02.02.19 10:02. Заголовок: Посмотри J:\Job&..
Посмотри harbour\src\rtl\hbsockhb.c
|
|
|
|
| moderator
|
Пост N: 1162
Зарегистрирован: 06.07.06
|
|
Отправлено: 02.02.19 10:14. Заголовок: Примеров именно с hb..
Примеров именно с hb_inet у меня нет, я его не использовал, но сделано это должно быть примерно так: на сервере - listen, accept, read, на клиенте - connect, write. Должен быть какой-то согласованный протокол, т.е., набор команд, которые посылает клиент и понимает сервер, ну типа той же SENDFILE из примера выше. Для синхронизации работы будет хорошо, если сервер будет посылать ответы на принятые команды. В принципе, в letodb или в guiserver - та же логика, тот же набор базовых функций, только вместо hb_inet другая библиотека.
|
|
|
|
| постоянный участник
|
Пост N: 349
Зарегистрирован: 29.05.10
|
|
Отправлено: 02.02.19 11:40. Заголовок: Клиент - пример выше..
Клиент - пример выше Вот пример с сервером - #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
|
|
|
|
| |
Пост N: 7010
Зарегистрирован: 17.05.05
|
|
Отправлено: 02.02.19 16:31. Заголовок: PSP пишет: Посмотри..
PSP пишет: цитата: | Посмотри harbour\src\rtl\hbsockhb.c |
| Шибко сложно и не понятно где почитать... Клиента предварительно сделал , файлик передается (в виде строки разумеется) и кушается тестовым сервером. Обошелся только возможностями инет подсистемы что описаны в доке от Кресина.
|
|
|
|
| постоянный участник
|
Пост N: 1498
Зарегистрирован: 27.01.07
|
|
Отправлено: 03.02.19 10:22. Заголовок: Dima пишет: Шибко с..
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 */ |
| Может тоже пригодится.
|
|
|
|
| |
Пост N: 7011
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.02.19 11:26. Заголовок: PSP пишет: Может то..
PSP пишет: Это понятно. Назначение функций мне не понятно , примеров нет , кроме того надо знать как работать корректно с сокетами. Можно конечно методом тыка , но это будет долго и с не понятным результатом. Не думаю что достаточно тех 3-х функций что ты выделил , хотелось бы корректно решить задачу а не абы как Спасибо за желание помочь !
|
|
|
|
| постоянный участник
|
Пост N: 1499
Зарегистрирован: 27.01.07
|
|
Отправлено: 03.02.19 13:48. Заголовок: Не за что. Помощи ка..
Не за что. Помощи как таковой и не было)) А можешь показать, чем ты решил?
|
|
|
|
|
| |
Пост N: 7012
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.02.19 14:20. Заголовок: PSP Примерно так ..
PSP Примерно так Скрытый текст #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
|
|
|
|
|
| |
Пост N: 7018
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.02.19 14:36. Заголовок: Заработала связь с а..
Заработала связь с андроид однако :)
|
|
|
|
| постоянный участник
|
Пост N: 1503
Зарегистрирован: 27.01.07
|
|
Отправлено: 13.02.19 10:16. Заголовок: Поделишься?))..
Поделишься?))
|
|
|
|
| |
Пост N: 7019
Зарегистрирован: 17.05.05
|
|
Отправлено: 13.02.19 10:20. Заголовок: PSP пишет: Поделишь..
PSP пишет: Чем ? Пример "клиента" я выложил. Задачу на Андроид писал не я.
|
|
|
|