Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
[Win32] Проблема с send() в winsocket`e 20.06.02 12:47 Число просмотров: 1437
Автор: 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
Еще не удается файл отправить
|
<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 Статус: Незарегистрированный пользователь
|
Что никто не знает?
|
|
|