информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаГде водятся OGRыЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
 С наступающим 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] Проблема с send() в winsocket`e 17.06.02 17:55  Число просмотров: 1176
Автор: ukv Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Если по каким-то причинам нельзя использовать блокирующий режим (а к данной задаче он подходит лучше всего), нужно или использовать select(), или же обрабатывать все коды ошибок, возвращаемых функцией WSAGetLastError() (по крайней мере так советуют в книжке "Программирование в сетях Windows").
<programming>
[Win32] Проблема с send() в winsocket`e 17.06.02 17:21  
Автор: DarkF0x Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Думаю кто-нибудь да сталкивался с этой проблемой
Пересылка файлов!!! через socket

Использую send(socket,buf,i,0);
сокет не в блокирующем режиме
То что функция возвращает (-1,0, или count of send bytes)
я знаю...
Пробовал анализировать то что она возвращает, если возвращала -1 то
этоже слал опять, пока не возвратит нужное количество байт для отправки... Все это делал в цикле... Система начинала ругаться, что мол системе существенно не хватает ресурсов...
Вопрос:)
Как пересылать файлы большого размера без багов?
Если есть такая возможность, дайте сырец (клиента и сервака)
[Win32] Проблема с send() в winsocket`e 21.06.02 11:44  
Автор: Vovik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Попробуй TransmitFile, как раз для этого!
[Win32] Проблема с send() в winsocket`e 20.06.02 12:47  
Автор: New Статус: Незарегистрированный пользователь
<"чистая" ссылка>

А есть ли у кого-нибудь исходник того же самого на асме?

Очень надо....

Вот мой вариант - он коннектится,но сообщение не приходит

.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

server db "ну здесь цифирки",0

.data?
hInstance dd ?
wsa WSADATA <?>
sockaddr_1 sockaddr_in <?>
fd dd ?
buf_recv db 4 dup (?)

.code
start:
invoke WSAStartup,101h,offset wsa

invoke socket,AF_INET,SOCK_STREAM,0
mov fd,eax

mov sockaddr_1.sin_family,AF_INET
invoke htons,25
mov sockaddr_1.sin_port,ax

invoke inet_addr,ADDR server
mov sockaddr_1.sin_addr,eax

invoke connect,fd,ADDR sockaddr_1,sizeof sockaddr_1

invoke _recv

lea esi,helo_
mov ecx,17 ;14+3
invoke _send
invoke _recv

lea esi,mfrom_
mov ecx,32 ;29+3
invoke _send
invoke _recv

lea esi,rcpt_
mov ecx,34 ;31+3
invoke _send
invoke _recv

lea esi,datas_
mov ecx,7 ;4+3
invoke _send
invoke _recv

lea esi,from_
mov ecx,15 ;12+3
invoke _send

lea esi,to_
mov ecx,13 ;10+3
invoke _send

lea esi,sub_
mov ecx,15 ;12+3
invoke _send

lea esi,nothing_
mov ecx,2 ;0+2
invoke _send

lea esi,this_
mov ecx,20 ;17+3
invoke _send

lea esi,point_
mov ecx,4 ;1+3
invoke _send
invoke _recv

lea esi,quit_
mov ecx,6 ;4+2
invoke _send
invoke _recv

invoke closesocket,fd

invoke WSACleanup

invoke ExitProcess,eax

_send proc
invoke send,fd,esi,ecx,0
xor ecx,ecx
ret
_send endp

_recv proc
invoke recv,fd,ADDR buf_recv,4,0 ;вот здесь не получается (торможу)
xor ecx,ecx
ret
_recv endp

end start

Еще не удается файл отправить
[Win32] Проблема с send() в winsocket`e 18.06.02 10:12  
Автор: IgorR <Igor Razin> Статус: Member
<"чистая" ссылка>
> Пересылка файлов!!! через socket
Пересылку можно организовать так (например по 1Кб):

==========================================================
if( dwFileSize <= 1024 )
CSocket.SendData( pvFileView, dwFileSize ); //Шлём из проекции
else{
DWORD dwTempAddr = (DWORD) pvFileView;
DWORD dwSizeToSend = 1024;
DWORD dwSentSize = 0;

for(;;){
CSocket.SendData( (PVOID) dwTempAddr, dwSizeToSend );

if( dwSentSize >= dwFileSize )
break; //Всё послали, выходим

dwTempAddr += 1024;

if( ( dwSentSize + 1024 ) <= dwFileSize )
dwSentSize += 1024;
else{
dwSizeToSend = dwFileSize - dwSentSize;
dwSentSize += dwSizeToSend;
}
}
}
==========================================================

Сокет блокирующий.
И не плохо бы предварительно договориться о размере передаваемого/принимаемого файла ;)
[Win32] Хрошо поставлю вопрос так... 19.06.02 11:57  
Автор: DarkF0x Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Я использую в клиенте стандартный компонент 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;

if( WSAStartup( MAKEWORD( 2,2 ), &wsd ) )
return ERROR_STARTUP_FAILED;

m_sClient = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if( m_sClient == INVALID_SOCKET )
return ERROR_SOCKED_FAILED;

server.sin_family = AF_INET;
server.sin_port = htons( iPort );
server.sin_addr.s_addr = inet_addr( szServer );

if( server.sin_addr.s_addr == INADDR_NONE )
{
host = gethostbyname( szServer );

if( host == NULL )
return ERROR_RESOLVE_FAILED;

CopyMemory( &server.sin_addr, host->h_addr_list[0], host->h_length );
}

if( connect( m_sClient, (sockaddr *) &server, sizeof(server) ) == SOCKET_ERROR )
return ERROR_CONNECT_FAILED;

m_fOnLine = TRUE;

return CONNECT_SUCCESS;
}

//#################################################################################//
[Win32] To IgorR 20.06.02 09:57  
Автор: DarkF0x Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > Он у меня не в блокирующем режиме...
> > Я пытался переводить его в блокирующий режим
> Нафига ты его изначально то не блкирующим делал?
У меня клиент реализован так, чтобы во время соединения с серваком можно было пользоваться его функциями... Как бы объяснить, короче я написал прогу удаленного администрирования... Клиент выглядит, что-то вроде WinCommandera... =) А сервак очень маленкий, я писал его на API, той-есть все ручками... =) Весит в запакованом состоянии всего 47 кил... А выполняет, все что может BackOriface.. Баг лиш недавно обнаружил..
Так вот в серваке все реализовано руками... А в клиенте, мать его, я пользовал стандартный Delphi компонент (сетевой), он бажный какой-то...
Короче у меня баг только с пересылкой файлов... =( И то, от клиента только... Так что еслибы я изначально задал бы сокет блокирующим...
Я не смог пользоваться функциями клиента, после конекта, он бы у меня "повисал".. Я уж думал на другой трид вешать, работу с сокетом...
Мне блокирующий не нужен.... Я понимаю и знаю, что в блокирующем режиме все проскакивает на УРА... Но для клиента мне это нафиг не подходит... Для сервака да, а для клиента..


> > Есть ли возможность узнать размер буфера сокета?
> getsockopt
За это спасибо... =)

> Другое дело для инициализации и коннекта. Это стандартно:
=) Гм..... Ну это-то мы знаем... =)
[Win32] To IgorR 20.06.02 12:58  
Автор: IgorR <Igor Razin> Статус: Member
<"чистая" ссылка>
>А в клиенте, мать его, я пользовал стандартный Delphi компонент
> (сетевой), он бажный какой-то...
Тогда опаньки ;)

>Я уж думал на другой трид вешать
Ну и повесил бы. Проблем то.

Короче в морг ;)
[Win32] To IgorR 21.06.02 10:02  
Автор: DarkF0x Статус: Незарегистрированный пользователь
<"чистая" ссылка>

> Короче в морг ;)
КОго в морг? =/ Прогу или .....
[Win32] Проблема с send() в winsocket`e 18.06.02 03:56  
Автор: 123mitya Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Как пересылать файлы большого размера без багов?

Использовать блокирующиеся сокеты, или зашифровывать данные перед отправкой таким методом, чтобы их можно было восстановить, в случае если не дойдут целиком.

В принципе пересылать файлы через неблокирующиеся сокеты - противоречит здравому смыслу (побьются все пакеты нафиг).
[Win32] Проблема с send() в winsocket`e 17.06.02 17:55  
Автор: ukv Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Если по каким-то причинам нельзя использовать блокирующий режим (а к данной задаче он подходит лучше всего), нужно или использовать select(), или же обрабатывать все коды ошибок, возвращаемых функцией WSAGetLastError() (по крайней мере так советуют в книжке "Программирование в сетях Windows").
Насчет исходников 20.06.02 12:32  
Автор: New Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Насчет исходников

Посмотри www.src.fitkursk.ru
там отличные исходники по этому делу видел (с++) буквально два дня назад
Автор исходников Фролов
Посмотри эти исходники там в разделе литературы или как там оно называется (не помню уже точно)
Там целая статья с подробнейшим описаловым и в архиве исходники
(server и client)
recv 20.06.02 16:07  
Автор: New Статус: Незарегистрированный пользователь
<"чистая" ссылка>
...
...
invoke connect,fd,ADDR sockaddr_1,sizeof sockaddr_1

invoke _recv - В дебаггере эта строчка выполняется,т.е. получаем ответ от сервера - > 220 .... ESMTP server ready

lea esi,helo_ это тоже выполняется
mov ecx,17 ;14+3
invoke _send это тоже выполняется
invoke _recv А ВОТ НА ЭТОМ ПРОГА ЗАВИСАЕТ

ЧТО ТАМ ТАКОГО МОЖЕТ БЫТЬ?
ПОДСКАЖИТЕ,ПЛИЗ
recv 21.06.02 07:15  
Автор: New Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Что никто не знает?
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach