Вопрос по сети ...у меня есть протокол обмена на асинхронных сокетах на асме ..... 1 поток ...с подтверждением доставки ...то есть ушел пакет и ждет пока ответ придет ....максимум ждет 50 сек или по событию доставки ...то есть назад ответ пришел что да принял ..и сразу 50 сек отменяются на локалке работает быстро в нете ультра медленно .... папку систем 32 получаю список оч долго ....а вот ФТП сервер ...на асме получает за 3 секи все папки с систем 32 ... почему так ? может слишком часто вызываю послать принять ???
calidus Советую изучить как работает TCP. Посылается куча пакетов сразу, а после и/или паролельно ловяться ответы. Если какогото пакет нет (не дошел) то посылается запрос на его получение. Так что отпровляем потоком. И чем больше поток тем лучше. А то с мелкими файлами возиться будет долго. Заодно советую изучить FTP протокол.
да но я просто не знаю если их 300 откуда мне знать какой не дошел .... изучаю постепенно ..посоветуешь по фтп инфу полезную может ??? только не офицальную ...куча мала , сугубо она техническая ... ченить чтоб изучать ...
Все сделает ? Ну пусть я тупой ... но уже пол года я насилую каждый день свой программу ...уже тысячи вариантов перепробовпал и хрен ... каждый кто специалист , смотрел и потом говорил я не знаю ... Смысл прост есть у меня сейчас протокол передачи уже не такой как раньше ... он имеет структуру из 7 пунктов формируется собственный пакет ...потом отсылается, в пакете есть определитель сервера что типо гот него ..данные ..адресс на данные длинна данных , это единственное что я нашел достойное ...потом в локалке все круто !!! быстро работает , а вот в сети после 2 ого посланного пакета не работает , всмысле все пакеты хер знает куда делись ...хотя на той стороне они отправлены а на этой не приняты , даже не пришло ничего .....вот прилагаю начальный вариант я его менял менял уже буфер для накопления делал ... ни как ....кстати сетевые программы точно также многие на асме .... вроде по описанию круто ...а потом испытать взял и в сети все накрылась ... а протокол фтп я смотрел , но разницу так и не усмотрел Код (Text): NRPacket STRUCT nrHeader db "NRP-" nrFCode dd ? nrPacketSeqNR dd ? nrPacketInSeq dd ? nrLenData dd ? ; nrDataCRC32 dd ? nrPointData dd ? nrTail dd ? NRPacket ENDS packet NRPacket <> packetHEAD db "NRP-" packetENDSEQ db "-ENP" packetNEXTSEQ db "-SEQ" packetBUFFER db 1024+24 dup(0) isReliable dd FALSE receiveLOCK dd FALSE fConn dd FALSE isHandshake dd FALSE socketDESCRIPTOR DD 0 remoteDESCRIPTOR dd 0 serverLISTENPORT dd 57341 clientID db "NSClient-sPISPJ99" cIDLEN dd $-clientID serverID db "NSServer-sPISPJ99" sIDLEN dd $-serverID Код (Text): .ELSEIF uMsg == WM_SOCKET ;#####################################;######################################################################################## ;##################################### ; Соединение ;######################################################### mov eax,lParam .IF ax == FD_ACCEPT ;######################################################################################## shr ax,16 .IF ax == NULL; ; отсутствует ошибка ;################################### invoke accept,socketDESCRIPTOR,0,0 mov remoteDESCRIPTOR,eax mov isHandshake, TRUE mov receiveLOCK, FALSE ; INVOKE MessageBox, NULL, addr AppName, addr AppName, MB_OK ;invoke MessageBox,NULL,addr Done,ADDR AppName,MB_OK ;##################################### .ENDIF ; Получения команды от клиента .ELSEIF ax == FD_READ INVOKE ProcessIncoming .ELSEIF ax == FD_WRITE ;######################################################################################## .ELSEIF ax == FD_CLOSE ;######################################################################################## .IF fConn==TRUE INVOKE ShutdownSocket, socketDESCRIPTOR INVOKE OpenSocket .IF eax==0 mov fConn, FALSE .ELSE mov socketDESCRIPTOR, eax invoke WSAAsyncSelect,socketDESCRIPTOR,hwnd2,WM_SOCKET,FD_ACCEPT+FD_READ+FD_WRITE+FD_CLOSE+FD_CONNECT INVOKE bind, socketDESCRIPTOR, ADDR sin, sizeof sin INVOKE listen, socketDESCRIPTOR, 20 .ENDIF .ENDIF .ELSEIF ax == FD_CONNECT ;######################################################################################## nop .ENDIF ;#################################################################################### ;#################################################################################### .ELSEIF invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF Код (Text): ProcessIncoming PROC .IF isHandshake==TRUE INVOKE ioctlsocket, remoteDESCRIPTOR, FIONREAD, ADDR availableData .IF eax==NULL INVOKE GlobalAlloc, GHND, availableData mov hMemory, eax INVOKE GlobalLock, eax mov offsetBuffer, eax INVOKE recv, remoteDESCRIPTOR, offsetBuffer, availableData, 0 INVOKE StrCmp, ADDR clientID, offsetBuffer, cIDLEN .IF eax==TRUE mov isReliable, TRUE mov isHandshake, FALSE INVOKE send, remoteDESCRIPTOR, ADDR serverID, sIDLEN, 0 .IF eax==0 || eax==SOCKET_ERROR mov eax, FALSE .ELSE mov eax, TRUE .ENDIF .IF eax==FALSE INVOKE ShutdownSocket, socketDESCRIPTOR INVOKE OpenSocket .IF eax==0 mov fConn, FALSE .ELSE mov socketDESCRIPTOR, eax INVOKE WSAAsyncSelect, socketDESCRIPTOR, hwnd2, WM_SOCKET, FD_ACCEPT + FD_READ + FD_CLOSE INVOKE bind, socketDESCRIPTOR, ADDR sin, 16 INVOKE listen, socketDESCRIPTOR, 20 mov fConn, TRUE .ENDIF .ENDIF .ELSE INVOKE ShutdownSocket, socketDESCRIPTOR INVOKE OpenSocket .IF eax==0 mov fConn, FALSE .ELSE mov socketDESCRIPTOR, eax INVOKE WSAAsyncSelect, socketDESCRIPTOR, hwnd2, WM_SOCKET, FD_ACCEPT + FD_READ + FD_CLOSE INVOKE bind, socketDESCRIPTOR, ADDR sin, sizeof sin INVOKE listen, socketDESCRIPTOR, 20 mov fConn, TRUE .ENDIF mov isHandshake, FALSE mov receiveLOCK, FALSE .ENDIF INVOKE GlobalUnlock, offsetBuffer INVOKE GlobalFree, hMemory ret .ENDIF .ENDIF .IF isReliable==TRUE INVOKE ioctlsocket, remoteDESCRIPTOR, FIONREAD, ADDR availableData .IF eax==NULL .IF availableData<=1048 INVOKE recv, remoteDESCRIPTOR, ADDR packetBUFFER, availableData, 0 ;invoke MessageBox,NULL,ADDR packetBUFFER,ADDR AppName,MB_OK .ELSE INVOKE recv, remoteDESCRIPTOR, ADDR packetBUFFER, 1048, 0 .ENDIF ; controllo header ;invoke MessageBox,NULL,ADDR packetHEAD,ADDR AppName,MB_OK ;invoke MessageBox,NULL,ADDR packetBUFFER,ADDR AppName,MB_OK INVOKE StrCmp, ADDR packetHEAD, ADDR packetBUFFER, 4 .IF eax==TRUE ; get function code mov esi, OFFSET packetBUFFER add esi, 4 lodsd push eax .IF receiveLOCK==FALSE mov reqOperation, eax mov currentPacket, 0 ; get total packets number & alloc buffer mov esi, OFFSET packetBUFFER add esi, 12 lodsd mov totalPackets, eax shl eax, 10 INVOKE GlobalAlloc, GHND, eax mov hMemory, eax INVOKE GlobalLock, eax mov offsetBuffer, eax mov receiveLOCK, TRUE .ENDIF pop eax .IF eax==reqOperation inc currentPacket ; get data length & copy data into buffer mov esi, OFFSET packetBUFFER add esi, 16 lodsd mov ebx, currentPacket dec ebx shl ebx, 10 mov edi, offsetBuffer add edi, ebx mov ecx, eax rep movsb mov eax, currentPacket .IF eax==totalPackets ; processo funzioni, dealloco buffers, receiveLOCK==FALSE .IF reqOperation==00000000h ; INVOKE nsRemoveServer invoke MessageBox,NULL,ADDR AppName,ADDR AppName,MB_OK .ELSEIF reqOperation==00000001h ; INVOKE nsMessageBox, offsetBuffer invoke MessageBox,NULL,ADDR AppName,ADDR AppName,MB_OK .ELSEIF reqOperation==00000002h ; INVOKE nsDDEExecute, offsetBuffer .ENDIF INVOKE GlobalUnlock, offsetBuffer INVOKE GlobalFree, hMemory mov receiveLOCK, FALSE .ENDIF .ENDIF .ENDIF .ENDIF .ENDIF INVOKE ClearBuffer, ADDR packetBUFFER, 1024+24 ret ProcessIncoming ENDP Код (Text): SendCommand PROC reqOP:DWORD, dataPTR:DWORD, usableSOCKET:DWORD .IF dataPTR!=NULL INVOKE StrLen, dataPTR .ELSE xor eax,eax .ENDIF shr eax, 10 inc eax ;uno in + per il controllo mov packet.nrPacketInSeq, eax ; 3. loop interno -> fill del packetBUFFER e invio (.WHILE eax<nrPacketInSeq, dove eax=nrPacketSeqNR) xor eax, eax .WHILE eax<packet.nrPacketInSeq push eax mov packet.nrPacketSeqNR, eax mov eax, reqOP mov packet.nrFCode, eax pop eax push eax .IF dataPTR==NULL mov packet.nrLenData, 0 mov packet.nrPointData, NULL mov esi, OFFSET packetENDSEQ mov edi, OFFSET packet.nrTail movsd .ELSE mov ebx, packet.nrPacketInSeq dec ebx .IF eax==ebx mov ebx, eax .IF ebx==0 INVOKE StrLen, dataPTR mov packet.nrLenData, eax mov eax, dataPTR mov packet.nrPointData, eax .ELSE mov ebx, dataPTR shl eax, 10 add ebx, eax mov inSendBuffer, ebx INVOKE StrLen, inSendBuffer mov packet.nrLenData, eax mov ebx, dataPTR mov eax, packet.nrPacketInSeq dec eax shl eax, 10 add ebx, eax mov packet.nrPointData, ebx .ENDIF mov esi, OFFSET packetENDSEQ mov edi, OFFSET packet.nrTail movsd .ELSE mov packet.nrLenData, 1024 shl eax, 10 mov ebx, dataPTR add ebx, eax mov packet.nrPointData, ebx mov esi, OFFSET packetNEXTSEQ mov edi, OFFSET packet.nrTail movsd .ENDIF .ENDIF mov edi, OFFSET packetBUFFER mov esi, OFFSET packet.nrHeader movsd mov esi, OFFSET packet.nrFCode movsd mov esi, OFFSET packet.nrPacketSeqNR movsd mov esi, OFFSET packet.nrPacketInSeq movsd .IF dataPTR==NULL xor eax, eax stosd stosd .ELSE mov esi, OFFSET packet.nrLenData movsd mov esi, packet.nrPointData mov ecx, packet.nrLenData rep movsb .ENDIF mov esi, OFFSET packet.nrTail movsd mov eax, packet.nrLenData add eax, 4+4+4+4+4+4 INVOKE send, usableSOCKET, ADDR packetBUFFER, eax, 0 .IF eax==0 || eax==SOCKET_ERROR INVOKE ClearBuffer, ADDR packetBUFFER, 1024+24 ret .ENDIF ; -- clear buffer INVOKE ClearBuffer, ADDR packetBUFFER, 1024+24 pop eax inc eax .ENDW ret SendCommand ENDP