Страница: 1 | 2 |
Вопрос: Программа-сервер на асме
Добавлено: 17.02.05 07:54
Автор вопроса: ZagZag | ICQ: 295002202
Есть ли у кого пример программы-сервера (ждет входящее подключение) на
ассемблере. Очень желательно чтобы он не создавал своих окон.
Если есть на MASM32 выложите, пожалуйста.
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 17.02.05 08:23
http://wasm.ru/src/5/cserver.zip
Номер ответа: 2
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #2
Добавлено: 17.02.05 08:50
cserver.asm
INVOKE GetModuleHandle,0
mov hInstance,eax
INVOKE GetCommandLine
mov CommandLine,eax
INVOKE WinMain,hInstance,0,CommandLine,SW_SHOWDEFAULT
INVOKE ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,0
mov wc.cbWndExtra,DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszClassName,OFFSET ClassName
mov wc.lpszMenuName,0
INVOKE LoadIcon,hInstance,offset IcoName
mov wc.hIcon,eax
mov wc.hIconSm,eax
INVOKE LoadCursor,0,IDC_ARROW
mov wc.hCursor,eax
INVOKE WSAStartup,101h,offset wsadata ;Use WinSock v1.1
INVOKE RegisterClassEx,addr wc ;Make Dialog box.
INVOKE CreateDialogParam,hInstance,offset DlgName,0,0,0
mov hDlg,eax
INVOKE ShowWindow,hDlg,SW_SHOWNORMAL
INVOKE UpdateWindow,hDlg
.WHILE TRUE ;Main window loop
INVOKE GetMessage,addr msg,0,0,0
.BREAK .IF (!eax)
INVOKE TranslateMessage,addr msg
INVOKE DispatchMessage,addr msg
.ENDW
INVOKE WSACleanup one with WinSock
mov eax,msg.wParam
ret
WinMain endp
Я вообщето без окон просил.. но и на этом огромное спасибо
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 17.02.05 11:42
Без окон еще проще - просто убираешь создание асинхронного сокета и при accept создаешь тред, куда передаешь хандл созданного acceptом сокета. Могу дать кусок своей программы на С++
Номер ответа: 4
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #4
Добавлено: 17.02.05 11:53
Ну так убери регистрацию и создание окна, оставь WSAStartup, Message Loop и WSACleanup
Номер ответа: 5
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #5
Добавлено: 17.02.05 19:53
cserver.asm - если это ТСР сервер тогда я летчик
Номер ответа: 6
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #6
Добавлено: 17.02.05 20:37
Гы. Думаешь, я туда смотрел?
Номер ответа: 7
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #7
Добавлено: 18.02.05 21:14
все, что здесь есть это:
INVOKE WSAStartup,101h,offset wsadata
INVOKE WSACleanup
это все сетевые вызовы проги! Даже и смотреть ненадо, само в глаза бросается. Ещё нужны вызовы socket, bind,listen, recv, send
Номер ответа: 8
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #8
Добавлено: 18.02.05 21:27
Номер ответа: 9
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #9
Добавлено: 18.02.05 21:28
Ахахаха - accept забыл, гений
Номер ответа: 10
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #10
Добавлено: 18.02.05 23:56
ну да, забыл...а что тебе не видно кода, что сверху???
Номер ответа: 11
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #11
Добавлено: 19.02.05 01:54
DaSharm:
Подскажи пожалуйста алгоритм (читать: последовательность вызовов сетевых
апи) самого простого "сервера"
Sharp:
Я еще один "сервер" откопал (без окон)
buffsz equ 256
.386
.model flat,stdcall
option casemap:none
include windows.inc
irp lb,<kernel32,wsock32,user32>
include &lb&.inc
includelib &lb&.lib
endm
threadproc proto
.data
capt db "information",0
servername db 25 dup (0)
servermsg db "This message was send from server!",0
servermsgsz dd offset servermsgsz - offset servermsg
wsa WSADATA <0>
sktaddr sockaddr_in <0>
client sockaddr_in <0>
skt dd 0
thread dd 0
junk dd 0
sktaddrsz dd sizeof(sockaddr)
tmp db buffsz dup (0)
server db sizeof(sockaddr_in) dup (0)
.code
_Start:
invoke WSAStartup,00010001h,offset wsa
invoke CreateThread,0,0,offset threadproc,0,0,offset junk
mov thread,eax
invoke socket, AF_INET,\ ; Address family
SOCK_DGRAM,\ ; Socket type
IPPROTO_UDP ; ProtocolAF_INET,SOCK_DGRAM,IPPROTO_UDP
cmp eax,INVALID_SOCKET
je noSock
mov skt,eax
mov ebx,offset server
assume ebx:ptr sockaddr_in
mov [ebx].sin_family,AF_INET
invoke htons,Port
mov [ebx].sin_port,ax
assume ebx:nothing
invoke bind, skt,\ ; Socket descriptor
offset server,\ ; Address to bind to
sizeof(sockaddr) ; Size of address
cmp eax,SOCKET_ERROR
je closesock
invoke recvfrom,skt,\ ; Bound socket
offset tmp,\ ; Receive buffer
buffsz,\ ; Size of buffer in bytes
0,\ ; Flags
offset client,\ ; Buffer to receive client address
offset sktaddrsz ; Length of client address buffer
invoke sendto,skt,\ ; Bound socket
offset servermsg,\ ; Receive buffer
servermsgsz,\ ; Size of buffer in bytes
0,\ ; Flags
offset client,\ ; Buffer to receive client address
offset sktaddrsz ; Length of client address buffer
invoke TerminateThread,thread,0
invoke MessageBoxA,0,offset tmp,offset capt,0
closesock:
invoke closesocket,skt
noSock:
invoke WSACleanup
invoke ExitProcess,0
threadproc proc
invoke gethostname,offset servername,25
invoke MessageBoxA,0,offset servername,offset capt,0
invoke ExitProcess,0
threadproc endp
end _Start
Только я не въехал как его доработать чтобы он отвечал на входящие
соединения (в смысле посылал при получении данных свой текст на IP клиента)
Номер ответа: 12
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #12
Добавлено: 19.02.05 09:59
Приведенный тобой код - это UDP-сервер, он не устанавливает соединение, UDP-клиент и UDP-сервер обмениваются дейтаграммами. Для TCP-сервера последовательность примерно следующая:
1) Инициализируешь сокеты WSAStartup
2) Создаешь сокет socket
3) Привязываешь его к порту, который он будет слушать bind
4) Слушаешь на предмет входящих соединений listen
5) Принимаешь входящее соединение accept
6) Создаешь новый тред, передаешь в него хандл вновь созданного сокета
7) В треде пишешь/читаешь с этого хандла данные, генерируешь реакцию сервера
8) Закрываешь сокет close
9) Деинициализируешь сокеты WSACleanup
Номер ответа: 13
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #13
Добавлено: 19.02.05 13:53
Я наверное совсем намеки пеерстал понимать
Короче, желаюя я написать серверок, чтобы, когда клиент к компьютеру
коннектился этот серверок ему отвечал.
C: HELO
S: HELO
C: VER
S: 1.0
C: MSG Privet ' Выдалось сообщение
S: OK
Отключились
Сервер переходит к ожиданию нового коннекта
Номер ответа: 14
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #14
Добавлено: 19.02.05 15:47
Ты плохо пытаешься заставить нас желать того же Если бы ты указал сумму, тогда, наверно, желающих стало бы больше, чем 1
Номер ответа: 15
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #15
Добавлено: 19.02.05 18:01
Да... Sharp прав. Если ты не умеешь кодить на АСМе, то нафига ваще писать на нем сервер???