winsock - recv
а пока что приходится разбираться во всем самому :)
в обшем, использую асинхронный режим (правильно делаю? в синхронном все тормозится) и ловлю сообшения от сокета:
procedure TForm1.WMSocketEvent(var Msg:TMessage);
а что делать при сообшении FD_Accept (пример данных)???
в обших чертах я знаю, но что КОНКРЕТНО делать?
другой комп посылает файл при помоши TransmitFile.
(в msdn написано надо так)
программа должна передавать файлы по сети через сокеты используя winsock. если у вас есть примеры или любая инфа по сабжу (без компонент), то поделить плз, очень надо.
Да полно в инете ведь! Искать не пробовал? Даже на этом же сайте: http://www.codenet.ru/progr/inet/TCPIP.php
procedure TForm1.WMSocketEvent(var Msg:TMessage);
а что делать при сообшении FD_Accept (пример данных)???
в обших чертах я знаю, но что КОНКРЕТНО делать?
другой комп посылает файл при помоши TransmitFile.
(в msdn написано надо так)
Чего-то не понял. Это где так в msdn написано? Про формы...
Да полно в инете ведь! Искать не пробовал? Даже на этом же сайте: http://www.codenet.ru/progr/inet/TCPIP.php
Чего-то не понял. Это где так в msdn написано? Про формы...
а при чем тут эта статья? я про передачу файлов, а там передача строки. разные же совсем веши. тем более не в асинхронном режиме т.е. без обработки сообщений.
искал пол дня в инете, нигде не нашел winapi пример передачи данных в инете. все такие умные ))) пишут отрывки из справок, а привести пример как это будет работать не могут :(
а откуда вы взяли msdn+формы? откуда формы???)))
а при чем тут эта статья? я про передачу файлов, а там передача строки. разные же совсем веши.
Да? Ты уверен? А помоему с точки зрения витой пары (например) это пофигу. И с точки зрения tcp/ip тоже совершенно пофигу. Разницу только ты видишь, и то она совершенно не принципиальна.
Что есть строка? Последовательность в n байт. Что есть файл? Последовательность в n байт.
Читаем файлик в буфер по кусочкам и отсылаем его через сокет.
тем более не в асинхронном режиме т.е. без обработки сообщений.
Чего-то я вообще не понимаю, чего тебе надо. Ты можешь точно описать конечную цель своего проекта?
искал пол дня в инете, нигде не нашел winapi
Хм... На http://msdn.microsoft.com не пробовал смотреть?
пример передачи данных в инете. все такие умные ))) пишут отрывки из справок, а привести пример как это будет работать не могут :(
А ты не подумал о том, что у людей могут быть какие-то свои дела, кроме того, что бы писать за тебя программу? Тебе вроде ни кто ни чем не обязан, что бы выкладывать сорцы завершенных рабочих проектов.
а откуда вы взяли msdn+формы? откуда формы???)))
Да что же это за глупый такой вопрос???
TForm1.WMSocketEvent(var Msg:TMessage);
а что делать при сообшении FD_Accept (пример данных)???
в обших чертах я знаю, но что КОНКРЕТНО делать?
другой комп посылает файл при помоши TransmitFile.
(в msdn написано надо так)
Вроде это ты писал и там присутствует предательская подстрока TForm1.
В общем, будут вопросы по делу - спрашивай. Не по делу - это как ты спросил: "где взять готовое, и почему ни кто мне ничего не делает?"
что делает комп при приеме данных с помошью transmitefile с другого компа.
если не сложно, запиши код плз :)
ну серьезно нигде не нашел :(
там есть моменты, которые не очень понятны начинаюшему кодеру, к сожалению у нас не продают книжек по сабжу, а ехать ха ней в москву шас нет времени. (здесь надо советовать мне книги на будущее ;) )
я так понял что в синхронном режиме сервер ждет пока клиент ему передаст файл (accept(...)) и все виснет в ожидании подключения. поэтому надо ловить сообшения от сокета, т.е. асинхроный режим.
просьба поправить плз если что не так, по крайней мере в некоторый статьях так писали.
не понятен всего лишь 1 момент (которого нигде не нашел):
что делает комп при приеме данных с помошью transmitefile с другого компа.
Ну я тоже как-то не в курсе что за функция такая. Ты где ее отрыл вообще? Сам могучий гугл о ней почти ничего не знает. Не говоря уж о msdn.
если не сложно, запиши код плз :)
Не сложно. Некогда. Завтра буду дома, если не забуду, то выложу - помоему че-то завалялось. Если не удалил :)
Вообще, делай как в статье. Читать файлы умеем с диска? Писать умеем их на диск? Если да, то тут не должно быть проблем - вместо строки в примере подставлять буфер чтения/записи файла. Если не умеем, то читаем матчасть, и повторяем предыдущий пункт.
к сожалению у нас не продают книжек по сабжу, а ехать ха ней в москву шас нет времени.
Ну-ну! Не надо мне ля-ля, что типа нужные книжки только в Москве продаются, и вообще - москали зажрались и надо помогать всем. :)
Если бы так было, то я бы щас совсем не в Москве сидел. К сведенью - основы winsock я изучал на модеме в Краснодаре. Который думаю не более развитой, чем твой Смоленск.
я так понял что в синхронном режиме сервер ждет пока клиент ему передаст файл (accept(...)) и все виснет в ожидании подключения.
Сделай в потоке и не мучай одно место. То, которым думаешь, что бы ты не подумал чего лишнего.
там и нашел, читая про сокеты. я шас за компом где нет msdn, позже скину тебе описание ф-ии.
не знаю как буфер записать в файл, наверно в этом проблема.
Если бы так было, то я бы щас совсем не в Москве сидел. К сведенью - основы winsock я изучал на модеме в Краснодаре. Который думаю не более развитой, чем твой Смоленск.
ни разу не видел у нас книжек по программированию сетки, я серьезно. каждый год езжу за литературой в москву, по крайней мере там дешевле в 1.5 раза и выбор огромен:)
понимаешь, проблема в том что сделать нужно срочно (есть еще 1 день в запасе) и некогда изучать все тонкости или биться головой в стену в поисках решения, плюс куча других дел :(
дык если в потоке, все равно все висит :)
в асинхронном режиме надо делать, кажется так правильно.
Ну я тоже как-то не в курсе что за функция такая. Ты где ее отрыл вообще? Сам могучий гугл о ней почти ничего не знает. Не говоря уж о msdn.
Плохо ищешь, товарисч! Цитата из msdn:
The TransmitFile function transmits file data over a connected socket handle. This function uses the operating system's cache manager to retrieve the file data, and provides high-performance file data transfer over sockets.
Note This function is a Microsoft-specific extension to the Windows Sockets specification. For more information, see Microsoft Extensions and Windows Sockets 2.
BOOL TransmitFile(
SOCKET hSocket,
HANDLE hFile,
DWORD nNumberOfBytesToWrite,
DWORD nNumberOfBytesPerSend,
LPOVERLAPPED lpOverlapped,
LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
DWORD dwFlags
);
Return Values
If the TransmitFile function succeeds, the return value is TRUE. Otherwise, the return value is FALSE. To get extended error information, call WSAGetLastError. The function returns FALSE if an overlapped I/O operation is not complete before TransmitFile returns. In that case, WSAGetLastError returns ERROR_IO_PENDING or WSA_IO_PENDING. Applications should handle either ERROR_IO_PENDING or WSA_IO_PENDING.
Remarks
The server optimizes the TransmitFile function for high performance. Workstations optimize the function for minimum memory and resource utilization. Expect better performance results when using TransmitFile on Windows Server.
Note TransmitFile is not functional on transports that perform their own buffering. Transports with the TDI_SERVICE_INTERNAL_BUFFERING flag set, such as ADSP, perform their own buffering. Because TransmitFile achieves its performance gains by sending data directly from the file cache. Transports that run out of buffer space on a particular connection are not handled by TransmitFile, and as a result of running out of buffer space on the connection, TransmitFile returns STATUS_DEVICE_NOT_READY.
Вроде всё понятно... Функция просто буферизирует файл автоматически (ну и передаёт его соответственно). Можно и ручками всё то же самое сделать, ничего сложного.
Плохо ищешь, товарисч! Цитата из msdn: Вроде всё понятно... Функция просто буферизирует файл автоматически (ну и передаёт его соответственно). Можно и ручками всё то же самое сделать, ничего сложного.
Хы-хы :) Чел неправильно название функции написал, а я глупо скопировал, потому и не нашел ничего. Ну ладно, мне оно и не надо.
Действительно ИМХО надежнее делать ручками, а не через Microsoft-specific. Потом и портировать никуда уже не получится безболезненно.
nordmen - чего там у тебя висит? Ты можешь толком написать, что должно получиться в итоге? ОС реального времени что ли? :) Если висит в потоке, а надо уже завершаться, то киляем поток и делаем что надо. Хотя по идее с чего оно будет висеть, там у тебя файл по 10 байт в минуту что ли передается, что бы висеть?
var AcceptSocket:integer;
...
AcceptSocket:=SOCKET_ERROR;
while AcceptSocket=SOCKET_ERROR do begin
AcceptSocket:=accept(vListenSocket,nil,nil);
application.processmessages;
CreateThread(nil,0,@SocketThread,0,0,trId);
end;
вот здесь и висит. все делается в отдельном потоке с обыкновенным приоритетом. так же как в статье. никакой отсебятины. до этого ошибо не возникет.
только на немецком, +надо преводить на delphi, т.к. там на с++.
в рунете на дельфи решения сабжа НЕТ.
вот решение http://fun-soft.ra-doersch.de/index.php?mod=forum&kuerzel=archiv&action=thread&id=402&PHPSESSID=lr2gv4b35kal92
только на немецком, +надо преводить на delphi, т.к. там на с++.
в рунете на дельфи решения сабжа НЕТ.
Ты все таки настаиваешь, что бы мы это сделали за тебя? Еще и на делфах...
Ты все таки настаиваешь, что бы мы это сделали за тебя? Еще и на делфах...
я не настаиваю, но это действительно было бы неплохо.
там я все равно ничего не понял :)
а как передать файл через поток?
src: TFileStream;
src:=TFileStream.Create('c:\file.txt', fmOpenRead);
так например создаем, а как поток получать, отправлять? (используя send, recv)
p.s.: pacific_7, если найдешь что нить у себя, или тут размерешься, прикрепи файлы плз.
тока не пинать особо за комментарии в коде. я делал это не себе и нужно было все обьяснять клиенту.