11 # include <sys/socket.h>
12 # include <netinet/in.h>
15 #include "../syscalls.h"
20 void SendData(void *Data, int Length);
21 int ReadData(void *Dest, int MaxLen, int Timeout);
26 SOCKET gSocket = INVALID_SOCKET;
28 # define INVALID_SOCKET -1
29 int gSocket = INVALID_SOCKET;
31 // Client ID to pass to server
32 // TODO: Implement such that each thread gets a different one
33 int giSyscall_ClientID = 0;
34 struct sockaddr_in gSyscall_ServerAddr;
41 /* Open windows connection */
42 if (WSAStartup(0x0101, &gWinsock) != 0)
44 fprintf(stderr, "Could not open Windows connection.\n");
50 // Open TCP Connection
51 gSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
53 // Open UDP Connection
54 gSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
56 if (gSocket == INVALID_SOCKET)
58 fprintf(stderr, "Could not create socket.\n");
66 memset((void *)&gSyscall_ServerAddr, '\0', sizeof(struct sockaddr_in));
67 gSyscall_ServerAddr.sin_family = AF_INET;
68 gSyscall_ServerAddr.sin_port = htons(SERVER_PORT);
69 gSyscall_ServerAddr.sin_addr.s_addr = htonl(0x7F000001);
73 memset((void *)&client, '\0', sizeof(struct sockaddr_in));
74 client.sin_family = AF_INET;
75 client.sin_port = htons(0);
76 client.sin_addr.s_addr = htonl(0x7F000001);
80 if( connect(gSocket, (struct sockaddr *)&gSyscall_ServerAddr, sizeof(struct sockaddr_in)) < 0 )
82 fprintf(stderr, "Cannot connect to server (localhost:%i)\n", SERVER_PORT);
83 perror("_InitSyscalls");
96 if( bind(gSocket, (struct sockaddr *)&client, sizeof(struct sockaddr_in)) == -1 )
98 fprintf(stderr, "Cannot bind address to socket.\n");
100 closesocket(gSocket);
110 // Ask server for a client ID
118 SendData(&req, sizeof(req));
120 len = ReadData(&req, sizeof(req), 5);
122 fprintf(stderr, "Unable to connect to server (localhost:%i)\n", SERVER_PORT);
126 giSyscall_ClientID = req.ClientID;
133 int SendRequest(tRequestHeader *Request, int RequestSize)
135 if( gSocket == INVALID_SOCKET )
141 Request->ClientID = giSyscall_ClientID;
145 for(i=0;i<RequestSize;i++)
147 printf("%02x ", ((uint8_t*)Request)[i]);
148 if( i % 16 == 15 ) printf("\n");
155 char *data = (char*)&Request->Params[Request->NParams];
156 printf("Request #%i\n", Request->CallID);
157 for( i = 0; i < Request->NParams; i ++ )
160 switch(Request->Params[i].Type)
163 printf("INT32 %x", *(uint32_t*)data);
164 data += sizeof(uint32_t);
167 printf("INT64 %llx", *(uint64_t*)data);
168 data += sizeof(uint64_t);
170 case ARG_TYPE_STRING:
171 printf("STRING '%s'", (char*)data);
172 data += Request->Params[i].Length;
175 printf("DATA %i %p", Request->Params[i].Length, (char*)data);
176 data += Request->Params[i].Length;
184 SendData(Request, RequestSize);
186 // Wait for a response (no timeout)
187 return ReadData(Request, RequestSize, 0);
190 void SendData(void *Data, int Length)
195 len = send(Data, Length, 0);
197 len = sendto(gSocket, Data, Length, 0,
198 (struct sockaddr*)&gSyscall_ServerAddr, sizeof(gSyscall_ServerAddr));
201 if( len != Length ) {
207 int ReadData(void *Dest, int MaxLength, int Timeout)
212 struct timeval *timeoutPtr;
215 FD_SET(gSocket, &fds);
226 ret = select(gSocket+1, &fds, NULL, NULL, timeoutPtr);
228 perror("ReadData - select");
233 printf("Timeout reading from socket\n");
238 ret = recv(gSocket, Dest, MaxLength, 0);
240 ret = recvfrom(gSocket, Dest, MaxLength, 0, NULL, 0);
248 printf("%i bytes read from socket\n", ret);