V-IntSockBase.asm
上传用户:santakups8
上传日期:2021-03-23
资源大小:544k
文件大小:13k
源码类别:

模拟服务器

开发平台:

Asm

  1. ;EasyCodeName=Module1,1
  2. ;-----------------------------------------------------------------------------------
  3. ;    VeMU
  4. ;    Its a package that allows the user to set his own server of the game
  5. ;    "MuOnline", this is not an emulator since i am not "emulating"
  6. ;    what the actual games does, i am "creating" a method for set a Server
  7. ;    of this Game.
  8. ;
  9. ;    Copyright (C) 2010  FelipeYa馿z
  10. ;
  11. ;    This program is free software: you can redistribute it and/or modify
  12. ;    it under the terms of the GNU General Public License as published by
  13. ;    the Free Software Foundation, either version 3 of the License, or
  14. ;    (at your option) any later version.
  15. ;
  16. ;    This program is distributed in the hope that it will be useful,
  17. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19. ;    GNU General Public License for more details.
  20. ;
  21. ;    You should have received a copy of the GNU General Public License
  22. ;    along with this program.  If not, see http://www.gnu.org/licenses/.
  23. ;-----------------------------------------------------------------------------------
  24. ;-----------------------------------------------------------------------------------
  25. ;                        -----------------
  26. ;                             Coded     /
  27. ;                              By      /
  28. ;                           -={FeN$x)=-
  29. ;                         /  Felipe Y.  
  30. ;                        /               
  31. ;                        -----------------
  32. ; Programming Lang: ASM
  33. ; Country: Chile
  34. ;              My respect for all those who lost their lifes
  35. ;              In the earthquake of my country...
  36. ;              Let god take their spirits home...
  37. ;-----------------------------------------------------------------------------------
  38. ;///////////////////////////////////////////////////////////////////////////////////////////////////
  39. ;               Fully ended, internal system connection of Valkyre emulator
  40. ; This is an approach to editable and fexible code, but at the same time very compressed,
  41. ; its a good emulation of WZ internal system connection. its not 100%, like original one,
  42. ; but its more compressed, avoiding some stupid WZ things and other things that C++ compiler do.
  43. ;
  44. ; This struct and procedures are used for internal connections to other clients like
  45. ; JoynServer, ConnectServer, RankingServer, DataServers & ExDB
  46. ;                              Coded by [INDIGO]FeN$x
  47. ;////////////////////////////////////////////////////////////////////////////////////////////////////
  48. V_Sock_CreateSocket Proto :Dword
  49. V_Sock_MakeAddr Proto :Dword, :Dword
  50. .Const
  51. .Data?
  52. .Data
  53. .Code
  54. V_Sock_SetAll Proc uses ecx
  55. Local pWSADATA:WSADATA ;Point to local struct
  56. assume ecx:ptr InternalClients_Struct
  57. Invoke WSAStartup, 202H, Addr pWSADATA
  58. .If (Eax != 0)
  59.   RGB 255, 127, 80 ;Coral (orange ligth)
  60.   invoke vprint, $CTA0("SockInteral:] Error on while loading WSA"), eax
  61.   xor eax, eax
  62. .else
  63.   mov edx, Dword ptr pWSADATA
  64.   and edx, 0FFFFh ;Word
  65.   .if (edx == 2) ;Check version high byte
  66.     mov edx, Dword ptr pWSADATA
  67.     and edx, 0FFFFh ;Word
  68.     shr edx, 8
  69.     and edx, 0FFh ;Byte
  70.     .if (edx == 2) ;Check version low byte
  71. push ecx ;Save struct
  72. invoke V_Sock_CreateSocket, [ecx].TCPorUDP ;Create a socket
  73. .if (eax == NULL)
  74.  RGB 255, 64, 64 ;Coral (orange ligth)
  75.  invoke vprint, $CTA0("SockInteral:] Error while creating Socket"), eax
  76.  xor eax, eax
  77. .else
  78.  invoke V_Sock_MakeAddr, [ecx].IPorName, [ecx].Port ;Convert IP or HOST name into internet address
  79.  .if (eax == NULL)
  80.    RGB 255, 64, 64 ;Coral (orange ligth)
  81.    invoke vprint, $CTA0("SockInteral:] Error while resolving Address"), eax
  82.    xor eax, eax
  83.  .else
  84.    call V_Sock_Connect ;Connect
  85.    .if (eax == NULL)
  86.      RGB 255, 64, 64 ;Coral (orange ligth)
  87.      invoke vprint, $CTA0("SockInteral:] Error while trying to connect to port:[%d]"), eax, [ecx].Port
  88.      xor eax, eax
  89.    .endif
  90.  .endif
  91. .endif
  92.     .else
  93.       RGB 255, 64, 64 ;Coral (orange ligth)
  94.       invoke vprint, $CTA0("SockInteral:] WSA Version its 2.[%d], please use 2.2"), eax, edx
  95.     .endif
  96.   .else
  97.     RGB 255, 64, 64 ;Coral (orange ligth)
  98.     invoke vprint, $CTA0("SockInteral:] WSA Version its too old, please use 2.2"), eax
  99.   .endif
  100. .endif
  101. pop ecx ;Return struct
  102. .if (eax == NULL)
  103.   call V_Sock_Close ;Close if something went wrong
  104.   xor eax, eax
  105. .endif
  106. Ret
  107. V_Sock_SetAll EndP
  108. V_Sock_Send Proc Uses Ecx pPacket:DWord, PacketLength:DWord
  109. Local MyStruct:DWord
  110. Local BytesSend:DWord
  111. Local ExtraBytes:DWord
  112.  Mov MyStruct, Ecx
  113.  Mov ExtraBytes, 0
  114.  Mov BytesSend, 0
  115.  Assume Ecx:Ptr InternalClients_Struct
  116.  mov eax, pPacket
  117.  mov edx, PacketLength
  118.  mov [ecx].pSendPacket, eax ;Save in case that we cant send the packet, caused WSAEWOULDBLOCK
  119.  mov [ecx].LastLengthPacket, edx ;Save in case that we cant send the packet, caused WSAEWOULDBLOCK
  120.  .If (edx == 0) ;If packet length its  0
  121.     RGB 255, 64, 64
  122.     invoke vprint, $CTA0("SockInteral:] Trying to send a NULL packet"), eax
  123.   Xor Eax, Eax
  124.  .Elseif ([Ecx].Connected == 0) ;If we arent connected
  125.      RGB 255, 64, 64
  126.      invoke vprint, $CTA0("SockInteral:] You arent connected to the internal client for send"), eax
  127.    Xor Eax, Eax
  128.  .Elseif (PacketLength > MAX_BUFF_LENGTH) ;If more than max buffer length
  129.      RGB 255, 64, 64
  130.      invoke vprint, $CTA0("SockInteral:] The packet exceed the MAX_BUFFER_LENGTH constant"), eax
  131.    Xor Eax, Eax
  132.  .Else
  133.    .Repeat
  134.   Mov Eax, PacketLength
  135.     Mov Edx, pPacket
  136.     Add Edx, ExtraBytes ;Packet + ExtraBytes if they are
  137.     Sub Eax, ExtraBytes ;PacketLength - ExtraBytes = NewPacketLength (if there are extra bytes)
  138.   Invoke send, [Ecx].Sock, Edx, Eax, NULL
  139.   Mov Ecx, MyStruct
  140.   Mov BytesSend, Eax
  141.   .If (Eax == -1)
  142.   Invoke WSAGetLastError
  143.   .If (Eax != WSAEWOULDBLOCK) ;If connection is busy
  144.             RGB 255, 64, 64
  145.             invoke vprint, $CTA0("SockInteral:] Connection busy for send, will resend when ready"), eax
  146.   mov eax, 2
  147.   .Else
  148.             mov edx, eax
  149.             RGB 255, 64, 64
  150.             invoke vprint, $CTA0("SockInteral:] Error when sending [%d]"), eax, edx
  151.   Xor Eax, Eax
  152.         .Endif
  153.     .Else
  154.       Mov Eax, PacketLength
  155.       .If (BytesSend != Eax) ;If not all the bytes where sended
  156.          Mov Edx, BytesSend
  157.          Add ExtraBytes, Edx
  158.       .Else
  159.             mov eax, 1
  160.           .Endif
  161.     .Endif
  162.    .Until (ExtraBytes == 0)
  163.  .Endif
  164. .if (eax == 1) || (eax == 0) ;If all went OK or a error happend
  165.   invoke V_ZeroBuff, Addr InternalPacket, MAX_PACKETSEND_LENGTH ;Clean the packet buffer
  166. .else ;If WSAEWOULDBLOCK then i dont clean the packet buffer
  167. .endif
  168.  Assume Ecx:Nothing
  169.  Ret
  170. V_Sock_Send EndP
  171. V_Sock_Recv Proc
  172. Local MyStruct:DWord
  173. Local BytesRecv:DWord
  174. Local RecvPacketLength:DWord
  175. Local RecvPacketHeader:Dword
  176. Local localExtraBytes:DWord
  177. .data
  178.  ExtraBytes DD ? ;Extra bytes in global mode
  179. .code
  180.  Mov localExtraBytes, 0
  181.  mov RecvPacketLength, 0
  182.  Mov MyStruct, Ecx
  183.  Assume Ecx:Ptr InternalClients_Struct
  184.  lea edx, [ecx].RecvBuff
  185.  add edx, ExtraBytes ;If there are extra bytes
  186.  Invoke recv, [Ecx].Sock, edx, [ecx].RecvBuffSize, 0
  187.  Mov BytesRecv, Eax
  188.  .If (Eax == 0)
  189.     RGB 255, 64, 64
  190.     invoke vprint, $CTA0("SockInteral:] Error no bytes recv"), eax
  191.     mov eax, -1
  192.  .ElseIf (Eax == -1)
  193.   Invoke WSAGetLastError
  194.   .If (Eax == WSAEWOULDBLOCK) ;if connection is busy
  195.       RGB 255, 64, 64
  196.       invoke vprint, $CTA0("SockInteral:] Connection busy to recv, we will recv later"), eax
  197.       mov eax, 1 ;We will try later to recv
  198.     .Else
  199.       RGB 255, 64, 64
  200.       invoke vprint, $CTA0("SockInteral:] Internal error while recv"), eax
  201.       mov eax, -1
  202.     .EndIf
  203.  .Else
  204.    Mov Ecx, MyStruct
  205.   .If (BytesRecv > 3) ;if less than 3 bytes
  206.        RGB 255, 64, 64
  207.        invoke vprint, $CTA0("SockInteral:] Error, less than 3 bytes recv"), eax
  208.        mov eax, -1
  209.   .Else
  210. CheckC1orC2:
  211.        Mov Edx, localExtraBytes
  212.       Movsx eax, Byte Ptr [[Ecx].RecvBuff + Edx]
  213.       .If (Al == 0C1H)
  214.     Xor Eax, Eax
  215.     Mov Edx, localExtraBytes
  216.     Movsx eax, Byte Ptr [[Ecx].RecvBuff + Edx + 1]
  217.     Mov RecvPacketLength, Eax
  218.     Movsx eax, Byte Ptr [[Ecx].RecvBuff + Edx + 2]
  219.     Mov RecvPacketHeader, eax
  220.       .ElseIf (Al == 0C2H)
  221.     Mov Edx, localExtraBytes
  222.     Xor Eax, Eax
  223.     Xor Ebx, Ebx
  224.     Movsx eax, Byte Ptr [[Ecx].RecvBuff + Edx + 1]
  225.     Shl Eax, 8
  226.     Movsx ebx, Byte Ptr [[Ecx].RecvBuff + Edx + 2]
  227.           Or Eax, Ebx
  228.           Mov RecvPacketLength, Eax
  229.           Movsx eax, Byte Ptr [[Ecx].RecvBuff + Edx + 3]
  230.     Mov RecvPacketHeader, eax
  231.         .Else
  232.           RGB 255, 64, 64
  233.           invoke vprint, $CTA0("SockInteral:] Invalid packet header"), eax
  234.           mov ExtraBytes, 0
  235.           mov eax, -1
  236.           jmp EndRecv
  237.         .EndIf
  238.         .If (RecvPacketLength == 0) ;If packet length its 0
  239.            RGB 255, 64, 64
  240.            invoke vprint, $CTA0("SockInteral:] Invalid length of packet"), eax
  241.            mov ExtraBytes, 0
  242.            mov eax, -1
  243.         .Else
  244.        Mov Ecx, MyStruct
  245.        Mov Edx, RecvPacketLength
  246.        .If (Edx <= BytesRecv) ;If the byte of packet is less or equal than the recived bytes
  247.         Xor Ebx, Ebx
  248.         Lea Edx, [Ecx].ProtocolAddr
  249.      Lea Eax, [Ecx].RecvBuff
  250.      Add Eax, localExtraBytes
  251.      Mov ebx, RecvPacketHeader
  252.      Push RecvPacketLength
  253.      Push Eax ;RecvBuffer
  254.      Push Ebx ;PacketHeader
  255.      Call Edx ;call Protocol core depending of the struct used
  256.      Mov Ecx, MyStruct
  257.      Mov Edx, RecvPacketLength
  258.      Add localExtraBytes, Edx
  259.      Sub BytesRecv, Edx
  260.      .If (BytesRecv < 0) ;if still bytes that we havent readed
  261.      Jmp CheckC1orC2
  262. CheckLoop:
  263.     .Else
  264.      mov ExtraBytes, 0 ;I make sure to set this
  265.                 mov eax, 1
  266.      .EndIf
  267.           .Else ;If byte packet of length says there still more bytes that the ones we actual recieve
  268.              mov edx, BytesRecv
  269.              add ExtraBytes, edx ;Save to global counter
  270.              xor eax, eax
  271.           .Endif
  272.         .Endif
  273.     .EndIf
  274.  .EndIf
  275. EndRecv:
  276.  .if (eax == -1) ;If some error has happen
  277.    mov ecx, MyStruct
  278.    invoke V_ZeroBuff, [ecx].RecvBuff, [ecx].RecvBuffSize ;Clean the buffer
  279.  .elseif (eax == 1) ;If we end succesfull reading the packet
  280.    mov ecx, MyStruct
  281.    invoke V_ZeroBuff, [ecx].RecvBuff, [ecx].RecvBuffSize ;Clean the buffer
  282.  .else ;If we expecting to link the next packet comming to the current we dont clean the buffer
  283.  .endif
  284.  Assume Ecx:Nothing
  285.  Ret
  286. V_Sock_Recv EndP
  287. ;/////////////////////////////////////////
  288. ;Create Socket
  289. ;////////////////////////////////////////
  290. V_Sock_CreateSocket Proc Uses Ecx UDPorTCP:Dword
  291.  assume ecx:ptr InternalClients_Struct
  292.  .If (UDPorTCP == 1) ;UDP
  293.   Mov Eax, SOCK_DGRAM
  294.  .Else
  295.   Mov Eax, SOCK_STREAM
  296.  .EndIf
  297.  Lea Ecx, [Ecx].Sock
  298.  Push Ecx
  299.  Invoke socket, AF_INET, Eax, IPPROTO_IP
  300.  Pop Ecx
  301.  .If (Eax == -1)
  302.     mov dword ptr [ecx], eax ;Unvalid Socket
  303.     xor eax, eax
  304.  .Else
  305.     Mov DWord Ptr [Ecx], Eax ;Save socket in struct
  306.  .EndIf
  307.  Assume Ecx:Nothing
  308.  Ret
  309. V_Sock_CreateSocket EndP
  310. ;///////////////////////////////////////////////////////
  311. ;Connect procedure
  312. ;///////////////////////////////////////////////////////
  313. V_Sock_Connect Proc uses ecx
  314. assume ecx:ptr InternalClients_Struct
  315. push ecx
  316. Invoke connect, [Ecx].Sock, addr [Ecx].SockAddr, SizeOf sockaddr_in
  317. pop ecx
  318. .If (Eax == -1)
  319.     Invoke WSAGetLastError
  320.  .If (Eax != WSAEWOULDBLOCK)
  321.     Xor Eax, Eax
  322.  .else
  323.         push ecx
  324. Invoke WSAAsyncSelect, [Ecx].Sock, [ecx].hWnd, [ecx].MSGID, FD_READ + FD_CLOSE
  325.         pop ecx
  326. .If (Eax == -1)
  327.    Xor Eax, Eax
  328. .Else
  329.    Mov [Ecx].Connected, 1 ;Already connected
  330. .EndIf
  331.      .endif
  332. .endif
  333. Assume Ecx:Nothing
  334. Ret
  335. V_Sock_Connect EndP
  336. ;/////////////////////////////////////////////////////////
  337. ;Custom proc for make an Host address from input arguments
  338. ;and save the address in UDP struct
  339. ;RETURN VALUES: 1 == SUCCESS, 0 == FAILURE
  340. ;/////////////////////////////////////////////////////////
  341. V_Sock_MakeAddr Proc Uses Ecx IPorName:DWord, Port:DWord
  342. Local MyStruct:DWord
  343. assume ecx:ptr InternalClients_Struct
  344. lea ecx, [ecx].SockAddr
  345. Assume Ecx:Ptr sockaddr_in
  346. Push Ecx
  347. Invoke ntohs, Port
  348. Pop Ecx
  349. Mov [Ecx].sin_family, 2
  350. Mov [Ecx].sin_port, Ax
  351. push ecx
  352. Invoke inet_addr, IPorName ;Take by IP
  353. pop ecx
  354. Mov [Ecx].sin_addr, Eax
  355. mov MyStruct, ecx ;Save for now struct in a variable
  356. .If (Eax == -1)
  357. Invoke gethostbyname, IPorName ;Take by Host Name
  358.    .If (Eax == 0)
  359.    .Else
  360.       Assume Eax:Ptr hostent
  361.       Mov Ecx, MyStruct
  362.       Mov Edx, DWord Ptr [Eax].h_list
  363.       Mov Ebx, [Edx] ;EBX = Host name converted
  364.       Invoke MemCopy, Ebx, Addr [Ecx].sin_addr, [Eax].h_len ;Save into sin_addr in our struct
  365.    .EndIf
  366. .EndIf
  367. Assume Ecx:Nothing
  368. assume eax:Nothing
  369. Ret
  370. V_Sock_MakeAddr EndP
  371. ;/////////////////////////////////////////
  372. ;Close socket
  373. ;////////////////////////////////////////
  374. V_Sock_Close Proc Uses Ecx
  375.  Assume Ecx:Ptr InternalClients_Struct
  376.  Push Ecx
  377.  Invoke shutdown, [Ecx].Sock, NULL
  378.  Pop Ecx
  379.  Push Ecx
  380.  Invoke closesocket, [Ecx].Sock
  381.  Pop Ecx
  382.  Mov [Ecx].Sock, -1
  383.  Mov [Ecx].Connected, 0
  384.  Assume Ecx:Nothing
  385.  Ret
  386. V_Sock_Close EndP