Пользователь
Регистрация: 12.11.2009
Сообщений: 20
|
Синхронизация потоков с использованием именованых каналов
Есть приложение-сервер и приложение-клиент
Сервер создаёт 3 реализации именованого канала и ждёт пока к нему подключатся клиенты. После подключения клиенты могут давать серверу команды date, time, help, exit. Выдать дату, выдать время, справка и выход соответствуююще. Проблема в том, что после запуска 3 приложений клиентов работает только одно, самое первое запущенное.
А необходимо сделать так, что бы срвер принимал команды от всех трёх клиентов одновременно.
Их надо синхронизировать с помощью критических секций.
Собсна вопросы:
1. Почему работает только самый первый клиент?
2. Что необходимо сделать, что бы 3 клиента работали парралельно?
3. В каком месте поставить вход в критическую секцию?
Код приложения сервер:
Код:
.686
.model flat, stdcall
option casemap :none
include ..\interface.inc
include PipeServer.inc
.code
start:
invoke Main
invoke ExitProcess,0
Main proc
invoke AllocConsole
invoke CharToOem,\
$CTA0("Предоставляет именованый канал для связи с другим процессом и выполняет полученные от него команды"),\
ADDR OutputBuffer
invoke SetConsoleTitle,ADDR OutputBuffer
invoke ClearScreen
mov ebx, 3
.while ebx != 0
invoke CreateNamedPipe, ADDR szPipeName,\
PIPE_ACCESS_DUPLEX OR FILE_FLAG_OVERLAPPED,\
PIPE_TYPE_MESSAGE OR PIPE_WAIT,\
3,\
LENGTHOF InputBuffer, LENGTHOF OutputBuffer,\
NULL, NULL
dec ebx
.endw
.if eax==INVALID_HANDLE_VALUE
invoke StdOut, $CTA0("Cannot create pipe")
invoke StdIn,ADDR InputBuffer, LENGTHOF InputBuffer
ret
.elseif
mov hPipe,eax
.endif
invoke StdOut, $CTA0("Connection . . .")
invoke ConnectNamedPipe,hPipe,NULL
invoke locate,11,0
invoke StdOut, $CTA0("successful")
invoke locate,0,2
lea esi,InputBuffer
lea edi,OutputBuffer
.while (TRUE)
invoke ReadFile,hPipe,esi,LENGTHOF InputBuffer,\
ADDR nSendReciveBytes, NULL
or dword ptr [esi],20202020h ;XxXx -> xxxx
invoke StdOut,esi
.break .if dword ptr [esi]==74697865h ;exit -> tixe
mov ebx,edi
.if dword ptr [esi]==65746164h
Сдесь код получения системной даты
и переод её в строку
invoke WriteFile,hPipe,edi, LENGTHOF OutputBuffer,\
ADDR nSendReciveBytes, NULL
.elseif dword ptr [esi]==656D6974h
Сдесь код получения системного времени
и перевод её в строку
invoke WriteFile,hPipe,edi, LENGTHOF OutputBuffer,\
ADDR nSendReciveBytes, NULL
.elseif dword ptr [esi]==706C6568H
invoke WriteFile,hPipe, $CTA0("Command list:\nhelp - view help\ntime - view current time\ndate - view current date\nexit - exit the program\n"), 128,\
ADDR nSendReciveBytes, NULL
.else
invoke WriteFile,hPipe, $CTA0("Bad command\n"), 13,\
ADDR nSendReciveBytes, NULL
.endif
invoke RtlFillMemory, addr OutputBuffer, 512, 00h
invoke RtlFillMemory, addr InputBuffer, 512, 00h
.endw
invoke WriteFile,hPipe,$CTA0("exit\n"), 6,\
ADDR nSendReciveBytes, NULL
invoke CloseHandle, hPipe
ret
Main endp
end start
Код приложения - клиента:
Код:
.386
.model flat, stdcall
option casemap :none
include ..\interface.inc
include PipeClient.inc
.code
start:
invoke Main
invoke ExitProcess,0
Main proc
invoke AllocConsole
invoke CharToOem,\
$CTA0("Взаимодействует с приложением предоставившим именованый канал"),\
ADDR OutputBuffer
invoke SetConsoleTitle,ADDR OutputBuffer
invoke ClearScreen
invoke StdOut, $CTA0("Connection . . . ")
invoke CreateFile, ADDR szPipeName,\
GENERIC_READ OR GENERIC_WRITE,\
0, NULL, OPEN_EXISTING, 0, NULL
.if eax==INVALID_HANDLE_VALUE
invoke locate,0,0
invoke StdOut, $CTA0("Cannot open pipe. Press Enter to exit...")
invoke StdIn,ADDR InputBuffer, LENGTHOF InputBuffer
ret
.else
mov hPipe,eax
.endif
invoke locate,11,0
invoke StdOut, $CTA0("successful")
invoke locate,0,2
lea esi,InputBuffer
lea edi,OutputBuffer
.while (TRUE)
mov ebx,edi
invoke StdOut,$CTA0("\nCommand$ ")
invoke StdIn,edi,LENGTHOF OutputBuffer
mov al,0Dh
mov ecx,LENGTHOF OutputBuffer
push edi
repne scasb
mov byte ptr [edi+1],0h
sub edi,ebx
lea ebx,[edi+2]
pop edi
invoke WriteFile,hPipe, edi, ebx,\
ADDR nSendReciveBytes,NULL
invoke ReadFile,hPipe,esi,\
LENGTHOF InputBuffer,ADDR nSendReciveBytes, NULL
invoke StdOut, esi
.break .if dword ptr [esi]==74697865h
invoke RtlFillMemory, addr OutputBuffer, 512, 00h
invoke RtlFillMemory, addr InputBuffer, 512, 00h
.endw
invoke CloseHandle, hPipe
ret
Main endp
end start
Я бы изменил мир, но исходников нету
|