]> git.8kb.co.uk Git - dataflex/df32func/blob - src/c/df32func.c
Initial import
[dataflex/df32func] / src / c / df32func.c
1 /*-------------------------------------------------------------------------\r
2  * df32func.c\r
3  *     df32func extensions for Console Mode DataFlex 3.2\r
4  *\r
5  * Copyright (c) 2007-2009, glyn@8kb.co.uk\r
6  * Author: Glyn Astill <glyn@8kb.co.uk>\r
7  *\r
8  *-------------------------------------------------------------------------\r
9  */\r
10 \r
11 #include "df32func.h"\r
12 #include <windows.h>\r
13 #include <stdio.h>\r
14 #include <stdlib.h>\r
15 #include <winsock.h>\r
16 \r
17 SOCKET s, sc; /* Socket handle */\r
18 \r
19 /*\r
20  * The number of cycles used by the processor since the start obtained on x86\r
21  * processors (Intel, AMD), with the assembly command rdtsc.\r
22  */\r
23 int rdtsc()\r
24 {\r
25     __asm__ __volatile__("rdtsc");\r
26 }\r
27 \r
28 /*\r
29  * CLIENTSOCKET \96 Creates a communication socket and connects to a remote host on the\r
30  *                supplied port and IP\r
31  */\r
32 DLLIMPORT int ClientSocket(int PortNo, char* IPAddress){\r
33     /* Start up Winsock */\r
34     WSADATA wsadata;\r
35 \r
36     int error = WSAStartup(0x0202, &wsadata);\r
37 \r
38     /* Did something happen? */\r
39     if (error){\r
40         return -1;\r
41     }\r
42 \r
43     /* Did we get the right Winsock version? */\r
44     if (wsadata.wVersion != 0x0202){\r
45         WSACleanup(); /* Clean up Winsock */\r
46         return -1;\r
47     }\r
48 \r
49     /* Fill out the information needed to initialize a socket */\r
50     SOCKADDR_IN target; /* Socket address information */\r
51 \r
52     target.sin_family = AF_INET; /*  address family Internet */\r
53     target.sin_port = htons (PortNo); /* Port to connect on */\r
54     target.sin_addr.s_addr = inet_addr (IPAddress); /* Target IP */\r
55 \r
56     s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); /* Create socket */\r
57     if (s == INVALID_SOCKET){\r
58         return -1; /* Couldn't create the socket */\r
59     }\r
60 \r
61     /* Try connecting */\r
62     if (connect(s, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR){\r
63         return -1; /* Couldn't connect */\r
64     }\r
65     else{\r
66         return s; /* Success - return our socket number */\r
67     }\r
68 }\r
69 \r
70 /*\r
71  * SERVERSOCKET \96 Creates a communication socket and a tcp server listening on a the\r
72  *                supplied port number\r
73  */\r
74 DLLIMPORT int ServerSocket(int PortNo){\r
75     /* Start up Winsock */\r
76     WSADATA wsadata;\r
77 \r
78     int error = WSAStartup(0x0202, &wsadata);\r
79 \r
80     /* Did something happen? */\r
81     if (error){\r
82         return -1;\r
83     }\r
84 \r
85     /* Did we get the right Winsock version? */\r
86     if (wsadata.wVersion != 0x0202){\r
87         WSACleanup(); /* Clean up Winsock */\r
88         return -1;\r
89     }\r
90 \r
91     /* Fill out the information needed to initialize a socket */\r
92     SOCKADDR_IN target; /* Socket address information */\r
93 \r
94     target.sin_family = AF_INET; /*  address family Internet */\r
95     target.sin_port = htons (PortNo); /* Port to connect on */\r
96     target.sin_addr.s_addr = INADDR_ANY; /* Target IP */\r
97 \r
98     s = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); /* Create socket */\r
99     if (s == INVALID_SOCKET){\r
100         return -1; /* Couldn't create the socket */\r
101     }\r
102 \r
103     /* Try to bind to the socket */\r
104     if (bind(s, (SOCKADDR *)&target, sizeof(target)) == SOCKET_ERROR) {\r
105         return -1; /* Couldn't connect */\r
106     }\r
107     else{\r
108          /* Now we can start listening, We allow SOMNAXCONN connections. This will not return until we get a connection */\r
109          if (listen(s, SOMAXCONN) == SOCKET_ERROR) {\r
110                        return -1;\r
111          }\r
112          else{\r
113               return s;\r
114          }\r
115     }\r
116 }\r
117 \r
118 /*\r
119  * CLOSECONNECTION \96 shuts down a communication socket and closes any connection on it\r
120  */\r
121 DLLIMPORT void CloseConnection (int socket){\r
122     /* Close the socket if it exists */\r
123     if (socket){\r
124         closesocket(socket);\r
125     }\r
126 \r
127     WSACleanup(); /* Clean up Winsock */\r
128 }\r
129 \r
130 /*\r
131  * SEND - Send data over the communication socket\r
132  */\r
133 DLLIMPORT int Send(int socket, char* data){\r
134          return send(socket, data, strlen(data), 0);\r
135 }\r
136 \r
137 /*\r
138  * RECEIVE - Recieve data over the client socket\r
139  */\r
140 DLLIMPORT int Receive(int socket, char *pData){\r
141        char data[255] = {0};\r
142        int bytesIn = 0;\r
143 \r
144        memset(data, 0, sizeof(data));\r
145        bytesIn = recv(socket, data, sizeof(data), 0);\r
146        if (bytesIn == SOCKET_ERROR) {\r
147                   return -1;\r
148        }\r
149        sprintf (pData, "%s", data );\r
150        return bytesIn;\r
151 }\r
152 \r
153 /*\r
154  * ACCEPTCLIENT - Accept a client connection\r
155  */\r
156 DLLIMPORT int AcceptClient(){\r
157        SOCKADDR_IN client;\r
158        int clientSize = sizeof(client);\r
159        sc = accept(s, (SOCKADDR *)&client, &clientSize);\r
160        if (sc == INVALID_SOCKET){\r
161               return -1;\r
162       }\r
163       return sc;\r
164 }\r
165 \r
166 /*\r
167  * Generate a pseudo random integer from an integer\r
168  */\r
169 DLLIMPORT unsigned int PseudoRand(unsigned int w){\r
170        unsigned int m_w = w;\r
171        unsigned int m_z = (w / 2);\r
172 \r
173        m_z = 36969 * (m_z & 65535) + (m_z >> 16);\r
174        m_w = 18000 * (m_w & 65535) + (m_w >> 16);\r
175        return (m_z << 16) + m_w;  /* 32-bit result */\r
176 }\r
177 \r
178 /*\r
179  * Generate a random integer from the cpu rdtsc\r
180  */\r
181 DLLIMPORT unsigned int RdtscRand(){\r
182      unsigned int n = 0;\r
183      int i;\r
184      /*  First digit must be non-zero: */\r
185      do\r
186      {\r
187             srand(rdtsc());\r
188             n = rand() % 8;\r
189      } while(n == 0);\r
190      for(i = 1; i < 8; i++)\r
191      {\r
192             n *= 8;\r
193             srand(rdtsc());\r
194             n += rand() % 8;\r
195      }\r
196      return n;\r
197 }\r
198 \r
199 /*\r
200  * DLL entry point\r
201  */\r
202 BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,\r
203                        DWORD reason        /* Reason this function is being called. */ ,\r
204                        LPVOID reserved     /* Not used. */ )\r
205 {\r
206     switch (reason)\r
207     {\r
208       case DLL_PROCESS_ATTACH:\r
209         break;\r
210 \r
211       case DLL_PROCESS_DETACH:\r
212         break;\r
213 \r
214       case DLL_THREAD_ATTACH:\r
215         break;\r
216 \r
217       case DLL_THREAD_DETACH:\r
218         break;\r
219     }\r
220 \r
221     /* Returns TRUE on success, FALSE on failure */\r
222     return TRUE;\r
223 }\r