Думаю кто-нибудь да сталкивался с этой проблемой
Пересылка файлов!!! через socket
Использую send(socket,buf,i,0);
сокет не в блокирующем режиме
То что функция возвращает (-1,0, или count of send bytes)
я знаю...
Пробовал анализировать то что она возвращает, если возвращала -1 то
этоже слал опять, пока не возвратит нужное количество байт для отправки... Все это делал в цикле... Система начинала ругаться, что мол системе существенно не хватает ресурсов...
Вопрос:)
Как пересылать файлы большого размера без багов?
Если есть такая возможность, дайте сырец (клиента и сервака)
[Win32] Проблема с send() в winsocket`e21.06.02 11:44 Автор: Vovik Статус: Незарегистрированный пользователь
А есть ли у кого-нибудь исходник того же самого на асме?
Очень надо....
Вот мой вариант - он коннектится,но сообщение не приходит
.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\wsock32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\advapi32.inc
includelib \masm32\lib\wsock32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\advapi32.lib
_send PROTO
_recv PROTO
.data
helo_ db "HELO yandex.ru",13,10,0
mfrom_ db "MAIL FROM:<tupism@mail.ru>",13,10,0
rcpt_ db "RCPT TO:<fulltupism@mail.ru>",13,10,0
datas_ db "DATA",13,10,0
from_ db "FROM: Sender",13,10,0
to_ db "TO: Victim",13,10,0
sub_ db "SUBJECT: Bla",13,10,0
nothing_ db 13,10
this_ db "This is an e-mail",13,10,0
point_ db ".",13,10,0
quit_ db "QUIT",13,10
Я использую в клиенте стандартный компонент clientsocket...
Он у меня не в блокирующем режиме...
Я пытался переводить его в блокирующий режим
( ioctlsocket(clientsocket1.socket.socket.handle,FIONBIO,socket_mode) )
вроде все OK OB... (по крайней мере ошибок не было...)
Ан нет, все равно блокирования не происходит!!! =( Той есть как я ни изгалялся одна @#$ня шлет когда весь пакет, когда меньше, но читаю-то я к примеру по 2 кила из файла, а шлет как хочет...
Я уж и пробовал руками создавать сокет и переводить его в блокинг режим вроде лучьше... =) Но встает другая проблема...
В серваке я использую WSAAsyncSelect и обрабатываю все сообщения в петле... ТОлько в серваке нет формы...
В клиенте форма есть (TFrom1) я пробовал тоже обрабатывать сообщения
Хрен там было... Не приходят...
Есть ли возможность узнать размер буфера сокета? Чтобы совать к примеру не 2 кила а меньше если у него нет места больше 2 кил...
P.S. Пробовал и select вызывать он "собака" все возвращает как надо, данные шлешь, фигня таже... Я уже и пробовал после отправки пакета
делать задержку... Вызывал sleep(100). Вроде проскакивало (но не всегда)
Пытался даже в цикле слать что-то вроде:
blockread(f,buff,i,i);
repeat
j:=send(socket,buff,i,0);
until (j=0)or(j=i);
где j=0 значит разрыв соединения..
j=i послано сколько передано
так он вроде шлет все нормально сколько отправил столько и пришло...
(Только винды из-за такой нагрузки вываливают "Системе существенно не хватает ресурсов"), оно и понятно...
Короче запарился я с этими сокета (мать их) Не навижу microsoft.......
Сетевики, не жмотитесь если есть сырцы пересылки фалов, дайте поюзать..
=) А то уже полный дипресняк...
[Win32] Хрошо поставлю вопрос так...19.06.02 16:39 Автор: IgorR <Igor Razin> Статус: Member
> Я использую в клиенте стандартный компонент clientsocket... Дык и я стандартный пользую ;)
Только в класс запихал.
> Он у меня не в блокирующем режиме... > Я пытался переводить его в блокирующий режим Нафига ты его изначально то не блкирующим делал?
> Есть ли возможность узнать размер буфера сокета? getsockopt
> Сетевики, не жмотитесь если есть сырцы пересылки фалов, > дайте поюзать.. Дык я тебе и дал для пересылки ;)
Другое дело для инициализации и коннекта. Это стандартно:
//################################################################################//
int CClientSocket::Connect( char szServer[MAX_SERVER_NAME_LENGTH], int iPort )
{
WSADATA wsd;
sockaddr_in server;
hostent *host;
> > Он у меня не в блокирующем режиме... > > Я пытался переводить его в блокирующий режим > Нафига ты его изначально то не блкирующим делал? У меня клиент реализован так, чтобы во время соединения с серваком можно было пользоваться его функциями... Как бы объяснить, короче я написал прогу удаленного администрирования... Клиент выглядит, что-то вроде WinCommandera... =) А сервак очень маленкий, я писал его на API, той-есть все ручками... =) Весит в запакованом состоянии всего 47 кил... А выполняет, все что может BackOriface.. Баг лиш недавно обнаружил..
Так вот в серваке все реализовано руками... А в клиенте, мать его, я пользовал стандартный Delphi компонент (сетевой), он бажный какой-то...
Короче у меня баг только с пересылкой файлов... =( И то, от клиента только... Так что еслибы я изначально задал бы сокет блокирующим...
Я не смог пользоваться функциями клиента, после конекта, он бы у меня "повисал".. Я уж думал на другой трид вешать, работу с сокетом...
Мне блокирующий не нужен.... Я понимаю и знаю, что в блокирующем режиме все проскакивает на УРА... Но для клиента мне это нафиг не подходит... Для сервака да, а для клиента..
> > Есть ли возможность узнать размер буфера сокета? > getsockopt За это спасибо... =)
> Другое дело для инициализации и коннекта. Это стандартно: =) Гм..... Ну это-то мы знаем... =)
[Win32] To IgorR20.06.02 12:58 Автор: IgorR <Igor Razin> Статус: Member
> Как пересылать файлы большого размера без багов?
Использовать блокирующиеся сокеты, или зашифровывать данные перед отправкой таким методом, чтобы их можно было восстановить, в случае если не дойдут целиком.
В принципе пересылать файлы через неблокирующиеся сокеты - противоречит здравому смыслу (побьются все пакеты нафиг).
[Win32] Проблема с send() в winsocket`e17.06.02 17:55 Автор: ukv Статус: Незарегистрированный пользователь
Если по каким-то причинам нельзя использовать блокирующий режим (а к данной задаче он подходит лучше всего), нужно или использовать select(), или же обрабатывать все коды ошибок, возвращаемых функцией WSAGetLastError() (по крайней мере так советуют в книжке "Программирование в сетях Windows").
Насчет исходников20.06.02 12:32 Автор: New Статус: Незарегистрированный пользователь
Посмотри www.src.fitkursk.ru
там отличные исходники по этому делу видел (с++) буквально два дня назад
Автор исходников Фролов
Посмотри эти исходники там в разделе литературы или как там оно называется (не помню уже точно)
Там целая статья с подробнейшим описаловым и в архиве исходники
(server и client)
recv20.06.02 16:07 Автор: New Статус: Незарегистрированный пользователь