EnglishРусский  

   ..

   ping.g

   proxy.g

   socket.g

   strinet.g

Ads

Perfect Automation tool
All-In-One: Script editor, Launcher, Scheduler, Keyboard & Mouse Recorder. Try now!

CreateInstall
Freeware and commercial installers.

Cell Phone Batteries
Batteries Plus offers batteries for laptop, camcorder, cell phone, camera.

Gentee needs your help!
How to advertise with us
 
laptop battery

source\lib\socket\socket.g
  1 /******************************************************************************
  2 *
  3 * Copyright (C) 2004-2008, The Gentee Group. All rights reserved. 
  4 * This file is part of the Gentee open source project - http://www.gentee.com. 
  5 * 
  6 * THIS FILE IS PROVIDED UNDER THE TERMS OF THE GENTEE LICENSE ("AGREEMENT"). 
  7 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE CONSTITUTES RECIPIENTS 
  8 * ACCEPTANCE OF THE AGREEMENT.
  9 *
 10 * Author: Alexey Krivonogov ( gentee )
 11 *
 12 ******************************************************************************/
 13 
 14 define
 15 {
 16    SD_RECEIVE     = 0x00
 17    SD_SEND        = 0x01
 18    SD_BOTH        = 0x02
 19    
 20    SOCKF_PROXY    = 0x0001  // Соединение через прокси
 21    SOCKF_FTP      = 0x0002  // FTP соединение 
 22 }
 23 
 24 /*-----------------------------------------------------------------------------
 25 * Id: tsocket T socket 
 26 * 
 27 * Summary: Socket structure.
 28 *
 29 -----------------------------------------------------------------------------*/
 30 
 31 type socket
 32 {
 33    str     host    // Host name.
 34    ushort  port    // Port number.
 35    uint    socket  // Open socket identifier.
 36    uint    flag    // Additional flags. #b($SOCKF_PROXY) - The socket is /
 37                    // opened via a proxy server. 
 38 }
 39 
 40 /*-----------------------------------------------------------------------------
 41 * Id: socket_isproxy F3
 42 *
 43 * Summary: Connecting via a proxy or not. This method can be used to determine
 44            if a socket is connected via a proxy server or not. 
 45 *
 46 * Return: 1 is returned if the socket is connected via a proxy server and 0 
 47           is returned otherwise. 
 48 *
 49 -----------------------------------------------------------------------------*/
 50 
 51 method uint socket.isproxy()
 52 {
 53    return this.flag & $SOCKF_PROXY
 54 }
 55 
 56 /*-----------------------------------------------------------------------------
 57 * Id: socket_close F3
 58 *
 59 * Summary: Closes a socket.
 60 *
 61 * Return: #lng/retf# 
 62 *
 63 -----------------------------------------------------------------------------*/
 64 
 65 method uint socket.close()
 66 {
 67    ineterror = shutdown( this.socket, $SD_BOTH )
 68    if !ineterror : ineterror = closesocket( this.socket )
 69    return !ineterror   
 70 }
 71 
 72 /*-----------------------------------------------------------------------------
 73 * Id: socket_connect F3
 74 *
 75 * Summary: Opens a socket. The method creates a socket and establishes a
 76            connection to the #b(host) and #b(port) specified in the host and
 77            port fields of the #a(tsocket) structure. 
 78 *
 79 * Return: #lng/retf# 
 80 *
 81 -----------------------------------------------------------------------------*/
 82 
 83 method uint socket.connect()
 84 {
 85    sockaddr_in saddr    
 86    uint        he ret
 87 
 88    // Получение хоста по имени
 89    saddr.sin_addr = inet_addr( this.host.ptr() )
 90    if saddr.sin_addr == 0xFFFFFFFF 
 91    {
 92       he = gethostbyname( this.host.ptr() )
 93       if !he : return inet_seterror()
 94       saddr.sin_addr = ( he->hostent.h_addr_list->uint)->uint
 95    }
 96    // Открытие сокета   
 97    this.socket = createsocket( $AF_INET, $SOCK_STREAM, $IPPROTO_TCP )
 98    if this.socket == $INVALID_SOCKET : return inet_seterror()
 99 
100    saddr.sin_family = $AF_INET
101    saddr.sin_port = htons( this.port )
102 
103    // Соединение   
104    ret = connect( this.socket, &saddr, sizeof( sockaddr ))
105    if ret == $SOCKET_ERROR
106    {
107       // Закрытие сокета в случае ошибки
108       this.close( )
109       return inet_seterror()   
110    }   
111    return 1
112 }
113 
114 /*-----------------------------------------------------------------------------
115 * Id: socket_recv F2
116 *
117 * Summary: The method gets a packet from the connected server.
118 *
119 * Params: data - The buffer for writing data. The received packet will be /
120                  added to the data already existing in the buffer.     
121 *  
122 * Return: #lng/retf# 
123 *
124 -----------------------------------------------------------------------------*/
125    
126 method uint socket.recv( buf data )
127 {
128    uint ret
129    
130    if data.use + 0x7FFF > data.size
131    {
132       data.expand( data.size + 0x7FFF )
133    }
134    ret = recv( this.socket, data.ptr() + data.use, 0x7FFF, 0  )
135    if ret == $SOCKET_ERROR
136    {
137       return inet_seterror()
138    }
139    data.use += ret
140    return 1
141 }
142    
143 /*-----------------------------------------------------------------------------
144 * Id: socket_send F2
145 *
146 * Summary: The method sends a request to the connected server.
147 *
148 * Params: data - Request string.     
149 *  
150 * Return: #lng/retf# 
151 *
152 -----------------------------------------------------------------------------*/
153    
154 method uint socket.send( str data )
155 {
156    if send( this.socket, data.ptr(), *data, 0  ) == $SOCKET_ERROR
157    {
158       return inet_seterror()
159    }
160    return 1
161 }   
162 
163 /*-----------------------------------------------------------------------------
164 ** Id: socket_send_1 FA
165 *
166 * Summary: The method sends a request data to the connected server.
167 *
168 * Params: data - Request buffer.     
169 *  
170 * Return: #lng/retf# 
171 *
172 -----------------------------------------------------------------------------*/
173 
174 method uint socket.send( buf data )
175 {
176    uint off last = *data
177    uint sent
178    
179    while last
180    {   
181       sent = send( this.socket, data.ptr() + off, last, 0  )
182       if sent == $SOCKET_ERROR
183       {
184          return inet_seterror()
185       }
186       last -= sent
187       off += sent
188    }
189    return 1
190 }   
Edit