Межпроцессное взаимодействие

Тема в разделе "WASM.ARTICLES", создана пользователем Mikl___, 24 апр 2022.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.352
    Список кодов ошибок, которые возникают при вызове команды send:
    Код ошибкиhexОписание
    WSANOTINITIALISED276DПеред использованием функции необходимо вызвать функцию WSAStartup
    WSAENETDOWN2742Сбой в сети
    WSAEACCES271DУказанный адрес является широковещательным (broadcast), однако перед вызовом функции не был установлен соответствующий флаг
    WSAEINTR2714Работа функции была отменена при помощи функции WSACancelBlockingCall
    WSAEINPROGRESS2734Выполняется блокирующая функция интерфейса Windows Sockets
    WSAEFAULT271EПараметр buf указан неправильно (он не указывает на адресное пространство, принадлежащее приложению)
    WSAENETRESET2744Необходимо сбросить соединение
    WSAENOBUFS2747Возникла блокировка буфера
    WSAENOTCONN2749Сокет не подсоединен
    WSAENOTSOCK2736Указанный в параметре дескриптор не является сокетом
    WSAESHUTDOWN274AСокет был закрыт функцией shutdown
    WSAEWOULDBLOCK2733Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
    WSAEMSGSIZE2738Был использован сокет типа SOCK_DGRAM (предназначенный для передачи датаграмм). При этом размер пакета данных превышает максимально допустимый для данной реализации интерфейса Windows Sockets
    WSAEINVAL2726Сокет не был подключен функцией bind
    WSAECONNABORTED2745Сбой из-за слишком большой задержки или по другой причине
    WSAECONNRESET2746Сброс соединения удаленным узлом
    При выполнении функции recv могут возникать следующие ошибки:
    Код ошибкиhexОписание
    WSANOTINITIALISED276DПеред использованием функции необходимо вызвать функцию WSAStartup
    WSAENETDOWN2742Сбой в сети
    WSAENOTCONN2749Сокет не подсоединен
    WSAEINTR2714Работа функции была отменена при помощи функции WSACancelBlockingCall
    WSAEINPROGRESS2734Выполняется блокирующая функция интерфейса Windows Sockets
    WSAENOTSOCK2736Указанный в параметре дескриптор не является сокетом
    WSAESHUTDOWN274AСокет был закрыт функцией shutdown
    WSAEWOULDBLOCK2733Сокет отмечен как неблокирующий, но запрошенная операция приведет к блокировке
    WSAEMSGSIZE2738Размер пакета данных превышает размер буфера, в результате чего принятый пакет был обрезан
    WSAEINVAL2726Сокет не был подключен функцией bind
    WSAECONNABORTED2745Сбой из-за слишком большой задержки или по другой причине
    WSAECONNRESET2746Сброс соединения удаленным узлом
    Передача и прием данных в цикле может привести к блокировке работы приложения. Если это неприемлемо, следует воспользоваться асинхронным расширением интерфейса Windows Sockets.
    Приложение демонстрирует асинхронный прием данных.
    После установки канала связи оно вызывает функцию WSAAsyncSelect, указывая в качестве последнего параметра комбинацию констант FD_READ и FD_CLOSE. Функция главного окна приложения получает сообщение WSA_NETEVENT в тот момент времени, когда чтение данных не вызовет блокировки приложения:
    Код (C):
    1. #define WSA_NETEVENT (WM_USER + 2)
    2. rc = WSAAsyncSelect (srv_socket, hWnd, WSA_NETEVENT, FD_READ | FD_CLOSE);
    При необходимости выполнения асинхронной посылки данных нужно указать функцию WSAAsyncSelect и параметр FD_WRITE.
    Если функция WSAAsyncSelect выполнилась успешно ― возвращается нулевое значение, при ошибке ― значение SOCKET_ERROR.
    В зависимости от значения последнего параметра могут возникать разные коды ошибки, которые можно получить при помощи функции WSAGetLastError. Следующие ошибки могут возникнуть при любом значении параметра:
    Код ошибкиhexОписание
    WSANOTINITIALISED276DПеред использованием функции необходимо вызвать функцию WSAStartup
    WSAENETDOWN2742Сбой в сети
    WSAEINVAL2726Сокет не был подключен функцией bind
    WSAEINPROGRESS2734Выполняется блокирующая функция интерфейса Windows Sockets
    Дополнительный код ошибки можно получить из параметра lParam при помощи макрокоманды WSAGETSELECTERROR.
    При использовании параметра FD_CONNECT возможно появление следующих ошибок:
    Код ошибкиhexОписание
    WSAEADDRINUSE2740Указанный адрес уже используется
    WSAEADDRNOTAVAIL2741Указанный адрес не доступен
    WSAEAFNOSUPPORT273FДля данного сокета нельзя использовать указанное семейство адресов
    WSAECONNREFUSED274DПопытка установления канала связи была отвергнута
    WSAEDESTADDRREQ2737Необходимо указать адрес получателя пакета
    WSAEFAULT271EНеправильно указан параметр namelen
    WSAEINVAL2726Сокет уже подключен к адресу
    WSAEISCONN2748Сокет уже подсоединен
    WSAEMFILE2728Больше нет доступных дескрипторов
    WSAENETUNREACH2743Из данного узла и в данное время невозможно получить доступ к сети
    WSAENOBUFS2747Нет места для размещения буфера
    WSAENOTCONN2749Сокет на подключен
    WSAENOTSOCK2736Указан дескриптор файла, а не сокета
    WSAETIMEDOUT274CПри попытке установления канала связи возникла задержка во времени
    Если используется параметр FD_CLOSE, может возникнуть одна из следующих ошибок:
    Код ошибкиhexОписание
    WSAENETDOWN2742Сбой в сети
    WSAECONNRESET2746Сброс соединения удаленным узлом
    WSAECONNABORTED2745Сбой из-за слишком большой задержки или по другой причине
    В том случае, когда указаны параметры FD_READ, FD_WRITE, FD_OOB, или FD_ACCEPT, может возникнуть ошибка с кодом WSAENETDOWN.
    Обработчик сообщения WSA_NETEVENT должен выполнить анализ причины, по которой он был вызван, так как за один вызов функции WSAAsyncSelect можно задать несколько событий, вызывающих генерацию сообщения. Этот анализ проводится следующим образом:
    Код (C):
    1. void WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    2. {
    3.   char szTemp[256];
    4.   int rc;
    5.  
    6.   // Если на сокете выполняется передача данных,
    7.   // прием и отображение этих данных в виде текстовой строки
    8.   if(WSAGETSELECTEVENT(lParam) == FD_READ )
    9.   {
    10.     rc = recv ((SOCKET)wParam, szTemp, 256, 0);
    11.     if(rc)
    12.     {
    13.       szTemp[rc] = '\0';
    14.       MessageBox(NULL, szTemp, "Reсeived data", MB_OK);
    15.     }
    16.     return;
    17.   }
    18.  
    19.   // Если соединение завершено -- вывод сообщения
    20.   else if(WSAGETSELECTEVENT(lParam) == FD_CLOSE )
    21.   {
    22.     MessageBox(NULL, "Connection closed", "Server", MB_OK);
    23.   }
    24. }
    Параметр wParam содержит дескриптор сокета, на котором выполняется передача данных, параметр lParam ― код события, которое произошло в сети.

    12.jpg
    Текст приложения-сервера (12s.asm)
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. ID_TXT equ 100
    4. ID_SEND_TXT equ 101
    5. ID_SEND_ICO equ 102
    6. ID_SEND_WAV equ 103
    7. IDC_DIALOG equ 200
    8. IDC_ICON1 equ 500
    9. IDC_IMG1 equ 104
    10. WINSOCK_VERSION equ 504
    11. SD_RECEIVE equ 0
    12. SD_SEND equ 1
    13. SD_BOTH equ 2
    14. WSADATA struct
    15.   wVersion dw ?;
    16.   wHighVersion dw ?
    17.   szDescription db (WSADESCRIPTION_LEN + 1) dup(?)
    18.   szSystemStatus db (WSASYS_STATUS_LEN + 1) dup(?)
    19.   iMaxSockets dw ?
    20.   iMaxUdpDg dw ?
    21.   lpVendorInfo dq ?
    22. WSADATA ends
    23. S_UN_B STRUCT
    24.   s_b1 BYTE ?
    25.   s_b2 BYTE ?
    26.   s_b3 BYTE ?
    27.   s_b4 BYTE ?
    28. S_UN_B ENDS
    29. S_UN_W STRUCT
    30.   s_w1 WORD ?
    31.   s_w2 WORD ?
    32. S_UN_W ENDS
    33. ADDRESS_UNION UNION
    34.    S_un_b S_UN_B <>
    35.    S_un_w S_UN_W <>
    36.    S_addr DWORD ?
    37. ADDRESS_UNION ENDS
    38. in_addr STRUCT
    39.   S_un ADDRESS_UNION <>
    40. in_addr ENDS
    41. SOCKADDR_IN STRUCT
    42.   sin_family    dw ?;is the same as af parameter in socket call. You must use AF_INET here.
    43.   sin_port      dw ?;is the port that the socket will use to communicate with the remote socket.
    44. ;This value depends on the higher level protocol that you want to use. If you want to connect to
    45. ;the remote socket for HTTP, use port 80 (decimal). However, note that the port value MUST be in
    46. ;network byte order that is big Endian. So you cannot use the port value per se but you must call
    47. ;htons to convert the value to network byte order first. This is one of the most common error the
    48. ;newcomers to winsock programming encounter.
    49.   sin_addr      in_addr <>;is the IP address of the remote host. Again, you must convert the
    50. ;IP address to network byte order before using it
    51.   sin_zero      BYTE 8 dup(?);is reserved. Don't mess with it
    52. SOCKADDR_IN ends
    53. .code
    54. WinMain proc
    55. enter 30h,0
    56. mov r9d,256;cx
    57. mov [rbp-10h],r9
    58. mov qword ptr [rbp-8],LR_DEFAULTCOLOR
    59. invoke LoadImage,IMAGE_BASE,IDC_ICON1,IMAGE_ICON;,256,256,LR_DEFAULTCOLOR
    60. mov r9d,offset DialogProc
    61. mov qword ptr[rbp-10h],rax;30h-10h=+20h
    62. invoke DialogBoxParam,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
    63. invoke RtlExitUserProcess,NULL
    64. WinMain endp
    65. DialogProc proc hWnddlg:QWORD,uMsg:QWORD,wParam:QWORD,lParam:QWORD
    66. local hFile:qword
    67. local cbWritten:dword
    68. local hResource:qword
    69. local pResource:qword
    70. local wsa:WSADATA
    71. local port:qword
    72. local FSize:qword
    73. mov hWnddlg,rcx
    74. mov lParam,r9
    75.        cmp edx,WM_INITDIALOG
    76.         je wmINITDIALOG
    77.        cmp edx,WM_CLOSE
    78.        je wmCLOSE
    79.        cmp edx,WM_COMMAND
    80.        je wmCOMMAND
    81.        cmp edx,WM_DESTROY
    82.        je wmDESTROY
    83.        xor eax,eax
    84.        jmp exit0
    85. wmDESTROY:invoke WSACleanup
    86. jmp wmBYE
    87. wmSEND_WAV:mov port,12345
    88.        mov type0,WM_USER+3
    89.         mov ecx,offset wav_file
    90.        xor r9d,r9d
    91.        mov qword ptr[rsp+30h],r9
    92.        mov qword ptr[rsp+28h],FILE_ATTRIBUTE_ARCHIVE
    93.        mov qword ptr[rsp+20h],OPEN_EXISTING
    94.        invoke CreateFile,,GENERIC_READ or GENERIC_WRITE,\
    95.        FILE_SHARE_READ or FILE_SHARE_WRITE
    96.         mov hFile,rax
    97.         invoke GetFileSize,eax,0
    98.        mov FSize,rax
    99.        invoke GlobalAlloc,GPTR,eax
    100.         mov p,rax
    101.        lea r9d,cbWritten
    102.        and qword ptr[rsp+20h],0
    103.         invoke ReadFile,hFile,eax,FSize
    104.         invoke CloseHandle,hFile
    105.        jmp @f
    106. wmSEND_ICO:mov port,12344
    107.        mov type0,WM_USER+2
    108.         mov edx,p1
    109.        invoke FindResource,0,,RT_ICON; find the resource
    110.        mov hResource,rax
    111.        invoke  SizeofResource,0,eax ; get its size
    112.        mov FSize,rax
    113.        invoke LoadResource,0,hResource ; load the resource
    114.        invoke LockResource,eax;pResource
    115.        mov p,rax
    116.        and qword ptr[rsp+30h],LR_DEFAULTCOLOR;LR_DEFAULTCOLOR=0
    117.        mov qword ptr[rsp+20h],256
    118.        mov qword ptr[rsp+28h],256
    119.        invoke  CreateIconFromResourceEx,eax,FSize,TRUE,30000h;270376,TRUE,30000h
    120.        mov [rsp+20h],rax
    121.        invoke  SendDlgItemMessage,hWnddlg,IDC_IMG1,STM_SETIMAGE,IMAGE_ICON
    122.        xor p1,11b
    123.        jmp @f
    124. wmSEND_TXT:mov port,12343
    125. mov type0,WM_USER+1
    126. invoke GlobalAlloc,GPTR,256
    127.         mov p,rax
    128. invoke GetDlgItemText,hWnddlg,ID_TXT,eax,256
    129. inc eax
    130. mov FSize,rax
    131. @@: mov edx,offset szWin
    132.         invoke  FindWindow,NULL
    133.         or      eax,eax
    134.         jz      wmBYE
    135. ; Отправить данные получателю
    136.        invoke PostMessage,eax,type0,hWnddlg,FSize
    137.        invoke SendData,p,FSize,port
    138.        jmp wmBYE
    139. wmINITDIALOG:invoke GetDlgItem,,IDC_IMG1
    140.        invoke SendMessage,eax,STM_SETIMAGE,IMAGE_ICON,lParam
    141. ; активировать библиотеку сокетов
    142.        lea edx,wsa
    143.        invoke WSAStartup,WINSOCK_VERSION
    144. ;An error occured if eax != null, because there's no return value for this api, if there's return,
    145. ;there's an error
    146.        jmp wmBYE
    147. wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + ID_SEND_TXT
    148.         je      wmSEND_TXT
    149.         cmp r8d,BN_CLICKED shl 16 + ID_SEND_WAV
    150.         je      wmSEND_WAV
    151.         cmp r8d,BN_CLICKED shl 16 + ID_SEND_ICO
    152.         je      wmSEND_ICO
    153.        cmp     r8d,BN_CLICKED shl 16 + IDCANCEL
    154.         jne     wmBYE
    155. wmCLOSE:invoke EndDialog,,0
    156. wmBYE: mov eax,TRUE
    157. exit0: leave
    158.        retn
    159. DialogProc endp
    160. SendData proc buf:qword,len:qword,port:qword
    161. local sock:QWORD
    162. local saddr:SOCKADDR_IN;sizeof(saddr)) =10h
    163. local bytesSent:dword
    164. mov buf,rcx
    165. mov len,rdx
    166. mov port,r8
    167. ; создать сокет
    168. invoke socket,AF_INET, SOCK_STREAM, IPPROTO_TCP
    169. mov sock,rax
    170. cmp eax,INVALID_SOCKET
    171. jz exit0;if (sock != INVALID_SOCKET)
    172. mov saddr.sin_family,AF_INET
    173. invoke htonl,INADDR_LOOPBACK
    174. mov saddr.sin_addr.S_un.S_addr,eax
    175. invoke htons,port;12345
    176. mov saddr.sin_port,ax
    177. ;After the socket is created, you have two choices: wait for an incoming connection or connect
    178. ;to a remote socket. If you want to wait for incoming connection, you must call listen to listen
    179. ;for an incoming connection and call accept to establish connection with the remote socket. If you
    180. ;want to connect to a remote socket, you must call connect
    181. mov r8d,sizeof saddr;the size of SOCKADDR_IN structure
    182. lea edx,saddr;a pointer to a SOCKADDR_IN structure
    183. invoke connect,sock;socket descriptor of the local socket. You can pass the socket
    184. ;descriptor returned by socket call as this parameter
    185. or eax,eax
    186. jnz @0;if (connect (sock,(struct sockaddr*)&saddr,sizeof (saddr)) == 0)
    187. @@: cmp len,0 ;       while (size)
    188. jz @0
    189. ;use send to send data on a stream socket and sendto to send data on a datagram socket. I'll
    190. ;examine send here since many popular protocols such as HTTP and FTP use stream sockets.
    191. ; запрос пришел - посылаем информацию
    192. invoke send,sock,buf,len, 0
    193. ;Parameters
    194. ; #1 socket == socket descriptor
    195. ; #2 buffer == address of the data that you want to send. The data need not be NULL-terminated
    196. ;since its size is specified in len parameter.
    197. ; #3 len == the size of data to send
    198. ; #4 flags == flags specifying the behavior of the function. There are two flags you can use:
    199. ; MSG_DONTROUTE : specifies that the data should not be subject to routing. Notice
    200. ;the word "should". Some windows socket implementation may ignore this flag.
    201. ; MSG_OOB : specifies that the data is out-of-band data.
    202. ;Normally we don't use any of these two flags, flags parameter should be 0 in this case.
    203. ;If the call is unsuccessful, the value SOCKET_ERROR is returned in eax.
    204. ;If it's successful, the actual number of bytes sent is returned in eax. Note that this number
    205. ;may not be equal to len parameter.
    206. or eax,eax
    207. jz @0;if (bytesSent <= 0)          break;
    208. sub len,rax;     size -= (uint32_t)bytesSent;
    209.         add buf,rax;    data = (uint8_t*)data + bytesSent;
    210. jmp @b
    211. ; закрыть связь
    212. @0:     invoke shutdown,sock,SD_BOTH
    213. ; закрыть сокет
    214. invoke closesocket,sock
    215. exit0: leave
    216. ret
    217. SendData endp
    218. ;---------------------------------------
    219. .data
    220. szWin db 'Socket Reciever',0
    221. wav_file db '..\Images\03.wav',0
    222. p dq ?
    223. p1 dd 1
    224. type0 dq ?
    225. end
    rc-файл (12s.rc)
    Код (C):
    1. #include "resource.h"
    2. #define ID_TXT 100
    3. #define ID_SEND_TXT 101
    4. #define ID_SEND_ICO 102
    5. #define ID_SEND_WAV 103
    6. #define IDC_IMG1 104
    7. #define IDC_DIALOG 200
    8. #define IDC_ICON1 500
    9. IDC_ICON1 ICON "..\\Images\\icon1.ico"
    10. IDC_ICON2 ICON "..\\Images\\icon2.ico"
    11. IDC_DIALOG DIALOG 0, 0, 212, 140
    12. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    13. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    14. CAPTION "Socket Sender"
    15. BEGIN
    16.     CONTROL "",-1,"BUTTON",BS_GROUPBOX, 2, -1, 207, 24
    17.     CONTROL "",IDC_IMG1,"Static",WS_CHILDWINDOW | WS_VISIBLE | SS_ICON,5,23,128,128
    18.     CONTROL "Write something and click 'Send Text'",ID_TXT,"EDIT",WS_BORDER | WS_TABSTOP |
    19.  ES_AUTOHSCROLL,5,7,199,13
    20.     DEFPUSHBUTTON "Send Text",ID_SEND_TXT,149,27,60,15
    21.     PUSHBUTTON   "Send ICO", ID_SEND_ICO,149,45,60,15
    22.     PUSHBUTTON   "Send WAV", ID_SEND_WAV,149,65,60,15
    23.     PUSHBUTTON   "Exit",     IDCANCEL,   149,85,60,15
    24. END
    Текст приложения-клиента (12r.asm)
    Код (ASM):
    1. ; GUI #
    2. include win64a.inc
    3. IDC_DIALOG equ 200
    4. IDC_OUTPUT equ 100
    5. ID_ICON equ 102
    6. IDC_ICON1 equ 500
    7. WINSOCK_VERSION equ 504
    8. SD_RECEIVE equ 0
    9. SD_SEND equ 1
    10. SD_BOTH equ 2
    11. WSADATA struct
    12.   wVersion dw ?;
    13.   wHighVersion dw ?
    14.   szDescription db (WSADESCRIPTION_LEN + 1) dup(?)
    15.   szSystemStatus db (WSASYS_STATUS_LEN + 1) dup(?)
    16.   iMaxSockets dw ?
    17.   iMaxUdpDg dw ?
    18.   lpVendorInfo dq ?
    19. WSADATA ends
    20. S_UN_B STRUCT
    21.   s_b1 BYTE ?
    22.   s_b2 BYTE ?
    23.   s_b3 BYTE ?
    24.   s_b4 BYTE ?
    25. S_UN_B ENDS
    26. S_UN_W STRUCT
    27.   s_w1 WORD ?
    28.   s_w2 WORD ?
    29. S_UN_W ENDS
    30. ADDRESS_UNION UNION
    31.    S_un_b S_UN_B <>
    32.    S_un_w S_UN_W <>
    33.    S_addr DWORD ?
    34. ADDRESS_UNION ENDS
    35. in_addr STRUCT
    36.   S_un ADDRESS_UNION <>
    37. in_addr ENDS
    38. SOCKADDR_IN STRUCT
    39.   sin_family    WORD      ?
    40.   sin_port      WORD      ?
    41.   sin_addr      in_addr <>
    42.   sin_zero      BYTE 8 dup (?)
    43. SOCKADDR_IN ends
    44. .code
    45. WinMain proc
    46. enter 30h,0
    47. mov r9d,offset DialogProc
    48. and qword ptr[rbp-10h],0
    49.         invoke  DialogBoxParam,IMAGE_BASE,IDC_DIALOG,HWND_DESKTOP
    50.         invoke  RtlExitUserProcess,NULL
    51. WinMain endp
    52. DialogProc proc hWnddlg:qword,msg:qword,wParam:qword,lParam:qword
    53. local wsa:WSADATA
    54. local clientSocket:qword
    55. local saddr:SOCKADDR_IN;sizeof(saddr)=10h
    56. local addrSize:dword
    57. local buffer[1024]:byte
    58. local lpwiocb:WAVEHDR
    59. local hWaveOut:qword
    60. mov hWnddlg,rcx
    61. mov lParam,r9
    62.         cmp edx,WM_INITDIALOG
    63. je wmINITDIALOG
    64. cmp edx,WM_CLOSE
    65. je wmCLOSE
    66. cmp edx,WM_COMMAND
    67. je wmCOMMAND
    68. cmp edx,WM_DESTROY
    69. je wmDESTROY
    70. cmp edx,WM_USER+1
    71. je wmUSER_1
    72. cmp edx,WM_USER+2
    73. je wmUSER_2
    74. cmp edx,WM_USER+3
    75. je wmUSER_3
    76. xor eax,eax
    77. jmp exit0
    78. wmDESTROY:cmp serverSocket,INVALID_SOCKET
    79. jz wmBYE
    80. invoke shutdown,serverSocket,SD_BOTH
    81. invoke closesocket,serverSocket
    82. or serverSocket,INVALID_SOCKET
    83. jmp wmBYE
    84. wmUSER_1:cmp serverSocket,INVALID_SOCKET
    85. jz @f
    86. invoke shutdown,serverSocket,SD_BOTH
    87. invoke closesocket,serverSocket
    88. ; Create a stream socket for internet use
    89. ; создать сокет
    90. @@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
    91. mov serverSocket,rax
    92. cmp eax,INVALID_SOCKET
    93. jz break
    94. ; подключить сокет
    95.         mov saddr.sin_family,AF_INET
    96. invoke htonl,INADDR_LOOPBACK
    97. mov saddr.sin_addr.S_un.S_addr,eax
    98. invoke htons,12343; convert port number into network byte order first
    99. mov saddr.sin_port,ax; адрес порта
    100. mov r8d,sizeof saddr
    101. lea edx,saddr
    102. invoke bind,serverSocket
    103. or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)
    104.         jnz break
    105. ; перевести сокет в состояние "слушать"
    106. invoke listen,serverSocket,256
    107. or eax,eax
    108. jnz break;if (listen (serverSocket, 256) == 0)
    109. ; ждем запроса от клиента
    110. mov addrSize,sizeof saddr
    111. lea edx,saddr
    112. lea r8d,addrSize
    113. invoke accept,serverSocket
    114. mov clientSocket,rax
    115. cmp eax,INVALID_SOCKET
    116. jz break;if (clientSocket == INVALID_SOCKET) break;
    117. ; запрос пришел - посылаем информацию
    118. @@: lea edx,buffer
    119. invoke recv,clientSocket,,1024,0
    120. ;recv is for use with a stream socket
    121. ;Parameters:
    122. ; #1 socket == socket descriptor
    123. ; #2 buffer == address of the memory block to store the incoming data.
    124. ; #3 len == the size of the memory block
    125. ; #4 flags == flags specifying the behavior of the function. There are two flags you can use:
    126. ; MSG_PEEK Peek at the incoming data. The data is copied into the buffer but is not
    127. ;removed from the input queue.
    128. ; MSG_OOB Process out-of-band data. This flag is usually used when FD_OOB notification
    129. ;is received. If the call is successful, it returns the number of bytes read from the socket. If it
    130. ;is unsuccessful, the value SOCKET_ERROR is returned. If the return value is 0, the remote socket
    131. ;has been closed
    132.         or eax,eax
    133. jnz @b;if (len <= 0)    break
    134. ; выводим строку символов
    135. lea r8d,buffer
    136. invoke  SetDlgItemText,hWnddlg,IDC_OUTPUT
    137. jmp @0
    138. wmUSER_2:;mov rax,lParam
    139. mov FSize,r9;ax
    140. cmp serverSocket,INVALID_SOCKET
    141. jz @f
    142. invoke shutdown,serverSocket,SD_BOTH
    143. invoke closesocket,serverSocket
    144. @@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP; Create a stream socket for internet use
    145. mov serverSocket,rax
    146. cmp serverSocket,INVALID_SOCKET
    147. jz break
    148. mov saddr.sin_family,AF_INET
    149. invoke htonl,INADDR_LOOPBACK
    150. mov saddr.sin_addr.S_un.S_addr,eax
    151. invoke htons,12344; convert port number into network byte order first
    152. mov saddr.sin_port,ax
    153. mov r8d,sizeof saddr
    154. lea edx,saddr
    155. invoke bind,serverSocket
    156. or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)
    157. jnz break
    158. invoke listen,serverSocket,256
    159. or eax,eax
    160. jnz break;if (listen (serverSocket, 256) == 0)
    161. mov addrSize,sizeof saddr
    162. lea edx,saddr
    163. lea r8d,addrSize
    164. invoke accept,serverSocket
    165. mov clientSocket,rax
    166. cmp eax,INVALID_SOCKET
    167. jz break;if (clientSocket == INVALID_SOCKET) break;
    168. invoke GlobalAlloc,GPTR,FSize
    169. mov p,rax
    170. mov edi,eax
    171. @@: lea edx,buffer
    172. invoke recv,clientSocket,,1024,0
    173. or eax,eax
    174. jz @f
    175. lea esi,buffer
    176. mov ecx,eax;1024
    177. rep movsb
    178. jmp @b;if (len <= 0)    break;
    179. @@: invoke  CreateIconFromResourceEx,p,FSize,TRUE,30000h,256,256,LR_DEFAULTCOLOR
    180. invoke  SendDlgItemMessage,hWnddlg,ID_ICON,STM_SETIMAGE,IMAGE_ICON,eax
    181. jmp @1
    182. wmUSER_3:;mov rax,lParam
    183. mov FSize,r9;ax
    184. cmp serverSocket,INVALID_SOCKET
    185. jz @f
    186. invoke shutdown,serverSocket,SD_BOTH
    187. invoke closesocket,serverSocket
    188. @@: invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP; Create a stream socket for internet use
    189. mov serverSocket,rax
    190. cmp eax,INVALID_SOCKET
    191. jz break
    192.         mov saddr.sin_family,AF_INET
    193. invoke htonl,INADDR_LOOPBACK
    194. mov saddr.sin_addr.S_un.S_addr,eax
    195. invoke htons,12345; convert port number into network byte order first
    196. mov saddr.sin_port,ax
    197. mov r8d,sizeof saddr
    198. lea edx,saddr
    199. invoke bind,serverSocket
    200. or eax,eax;if (bind (serverSocket, (struct sockaddr*)&saddr, sizeof(saddr)) == 0)
    201. jnz break
    202. invoke listen,serverSocket,256
    203. or eax,eax
    204. jnz break;if (listen (serverSocket, 256) == 0)
    205. mov addrSize,sizeof saddr
    206. lea edx,saddr
    207. lea r8d,addrSize
    208. invoke accept,serverSocket
    209. mov clientSocket,rax
    210. cmp eax,INVALID_SOCKET
    211. jz break;if (clientSocket == INVALID_SOCKET) break;
    212. invoke GlobalAlloc,GPTR,FSize
    213. mov p,rax
    214. mov edi,eax
    215. @@: lea edx,buffer
    216. invoke recv,clientSocket,,1024,0
    217. or eax,eax
    218. jz @f
    219. lea esi,buffer
    220. mov ecx,eax;1024
    221. rep movsb
    222. jmp @b;if (len <= 0)    break;
    223. @@: mov r8,p
    224. ;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data) = 14h
    225.         add r8d,14h
    226.         invoke waveOutOpen,&hWaveOut,WAVE_MAPPER,,0,0,WAVE_ALLOWSYNC
    227. ; Подготавливаем заголовок для вывода
    228. lea edx,lpwiocb
    229. mov edi,edx
    230. xor eax,eax
    231. mov ecx,(sizeof WAVEHDR)/8
    232. rep stosq
    233. mov rax,p
    234. ;"RIFF"+(File size)+(File Type Header)+(Format chunk marker)+(Length of format data)+\
    235. ;(Type of format)+(Number of Channels)+(Sample Rate)+(Sample Rate*BitsPerSample*Channels/8)+\
    236. ;(BitsPerSample*Channels/8)+(Bits per sample)+(“data” chunk header)+(Size of the data section)=2Ch
    237. add rax,2Ch
    238. mov [rdx].WAVEHDR.lpData,rax ;адрес блока данных
    239. mov rax,FSize
    240. sub eax,2Ch
    241. mov [rdx].WAVEHDR.dwBufferLength,eax ;размер блока данных
    242. invoke waveOutPrepareHeader,hWaveOut,,sizeof WAVEHDR
    243. ; Запускаем проигрывание блока
    244. invoke waveOutWrite,hWaveOut,&lpwiocb,sizeof WAVEHDR
    245. @@: test lpwiocb.dwFlags,WHDR_DONE
    246. jz @b
    247. invoke waveOutUnprepareHeader,hWaveOut,&lpwiocb,sizeof WAVEHDR
    248. invoke waveOutClose,hWaveOut
    249. ;----------------------------------------------------------
    250. @1: invoke GlobalFree,p
    251. ; закрыть связь
    252. @0: invoke shutdown,clientSocket,SD_BOTH
    253. ; закрыть сокет
    254. invoke closesocket,clientSocket
    255. ;This function closes a socket. Every resource of the socket will be released
    256. break: cmp serverSocket,INVALID_SOCKET;if (serverSocket != INVALID_SOCKET)
    257. jz wmBYE
    258. invoke shutdown,serverSocket,SD_BOTH
    259. invoke closesocket,serverSocket
    260. mov serverSocket,INVALID_SOCKET
    261. jmp wmBYE
    262. wmINITDIALOG:;mov hWnd,rcx
    263. ; Найти окно отправителя
    264. mov edx,offset szWin
    265.         invoke  FindWindow,NULL
    266.         or      eax,eax
    267.         jnz wmBYE
    268. mov edx,offset Error1
    269. mov r8d,offset szAppName
    270. invoke MessageBox,hWnddlg,,,MB_ICONEXCLAMATION or MB_YESNO
    271. cmp eax,IDNO
    272. jz      wmBYE
    273. mov ecx,offset szService
    274. invoke WinExec,,SW_SHOW
    275. ;активировать библиотеку сокетов
    276. lea edx,wsa
    277. invoke WSAStartup,WINSOCK_VERSION
    278. jmp wmBYE
    279. ;--------------------------------------------------
    280. wmCOMMAND:cmp r8d,BN_CLICKED shl 16 + IDCANCEL
    281. jne wmBYE
    282. wmCLOSE:invoke EndDialog,,0
    283. wmBYE: mov eax,TRUE
    284. exit0: leave
    285. retn
    286. DialogProc endp
    287. ;-----------------------------------------------------------------------
    288. .data
    289. szWin db "Socket Sender",0
    290. Error1 db "The server is not running.",10,"Run?",0
    291. szAppName db "Socket Reciever",0
    292. szService db "12s",0
    293. serverSocket dq INVALID_SOCKET
    294. ;threadHandleTxt dq ?
    295. ;threadHandleIco dq ?
    296. ;threadHandleWav dq ?
    297. ;threadId dd ?
    298. ;hWnd dq ?
    299. FSize dq ?
    300. p dq ?
    301. end
    rc-файл (08r.rc)
    Код (C):
    1. #include "resource.h"
    2. #define IDC_DIALOG 200
    3. #define IDC_OUTPUT 100
    4. #define ID_ICON 102
    5. IDC_DIALOG DIALOG 0,0,212,140
    6. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    7. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    8. CAPTION "Socket Reciever"
    9. BEGIN
    10. CONTROL "",-1,"BUTTON",BS_GROUPBOX, 2, -1, 207, 24
    11. CONTROL "",IDC_OUTPUT,"STATIC",WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL,5,7,199,13
    12. DEFPUSHBUTTON  "Exit",IDCANCEL,149,27,60,15
    13.         CONTROL 1,ID_ICON,"STATIC",WS_CHILDWINDOW | SS_ICON,5,23,128,128
    14. END
    в аттаче ASM-/RC-/EXE-файлы

    Благодарности

    Огромное спасибо rmn за подсказки, замечания и предоставленную программу :yes3:
     

    Вложения:

    • 12_Socket.zip
      Размер файла:
      247,1 КБ
      Просмотров:
      8
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.352

    09_Mutex

    Блин #2. Более удачный, хотя и не последний вариант

    Пока только текст, но выводится без ошибок, вариант с передачей картинок и WAV-файлов будет позже (хотя есть вероятность, что механизм мьютексов не предназначен для такого интенсивного обмена сообщениями, но буду пробовать :) )...

    09.jpg
     

    Вложения:

    • 09_Mutex.zip
      Размер файла:
      245,2 КБ
      Просмотров:
      2