for( ;; )
{
fd_set fds;
- int nfd = Client->Socket;
+ int nfd = Client->Socket+1;
FD_ZERO(&fds);
FD_SET(Client->Socket, &fds);
- select(nfd, &fds, NULL, NULL, NULL); // TODO: Timeouts?
+ int rv = select(nfd, &fds, NULL, NULL, NULL); // TODO: Timeouts?
+ if(rv <= 0) {
+ perror("select");
+ continue ;
+ }
if( FD_ISSET(Client->Socket, &fds) )
{
char lbuf[sizeof(tRequestHeader) + ciMaxParamCount*sizeof(tRequestValue)];
tRequestHeader *hdr = (void*)lbuf;
size_t len = recv(Client->Socket, hdr, sizeof(*hdr), 0);
- if( len != sizeof(hdr) ) {
+ Log_Debug("Server", "%i bytes of header", len);
+ if( len == 0 ) break;
+ if( len != sizeof(*hdr) ) {
// Oops?
+ Log_Warning("Server", "FD%i bad sized (%i != exp %i)",
+ Client->Socket, len, sizeof(*hdr));
+ continue ;
}
if( hdr->NParams > ciMaxParamCount ) {
// Oops.
+ Log_Warning("Server", "FD%i too many params (%i > max %i)",
+ Client->Socket, hdr->NParams, ciMaxParamCount);
+ continue ;
}
len = recv(Client->Socket, hdr->Params, hdr->NParams*sizeof(tRequestValue), 0);
+ Log_Debug("Server", "%i bytes of params", len);
if( len != hdr->NParams*sizeof(tRequestValue) ) {
// Oops.
}
hdr = malloc(bufsize);
memcpy(hdr, lbuf, hdrsize);
len = recv(Client->Socket, hdr->Params + hdr->NParams, bufsize - hdrsize, 0);
+ Log_Debug("Server", "%i bytes of data", len);
if( len != bufsize - hdrsize ) {
// Oops?
}
retHeader = SyscallRecieve(hdr, &retlen);
if( !retHeader ) {
// Some sort of error
+ Log_Warning("Server", "SyscallRecieve failed?");
+ continue ;
}
send(Client->Socket, retHeader, retlen, 0);
len = recv(clientSock, &authhdr, sizeof(authhdr), 0);
if( len != sizeof(authhdr) ) {
// Some form of error?
+ Log_Warning("Server", "Client auth block bad size (%i != exp %i)",
+ len, sizeof(authhdr));
+ continue ;
}
+ Log_Debug("Server", "Client assumed PID %i", authhdr.pid);
+
tClient *client;
if( authhdr.pid == 0 ) {
// Allocate PID and client structure/thread
client->Socket = clientSock;
}
}
+ Log_Debug("Server", "Client given PID %i", authhdr.pid);
len = send(clientSock, &authhdr, sizeof(authhdr), 0);
if( len != sizeof(authhdr) ) {
/*
*/
-#define DEBUG 0
+#define DEBUG 1
#if DEBUG
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
+#include <inttypes.h>
#ifdef __WIN32__
# include <windows.h>
# include <winsock.h>
#include "request.h"
#include "../syscalls.h"
-#define USE_TCP 0
+#define USE_TCP 1
// === PROTOTYPES ===
void SendData(void *Data, int Length);
if( connect(gSocket, (struct sockaddr *)&gSyscall_ServerAddr, sizeof(struct sockaddr_in)) < 0 )
{
fprintf(stderr, "[ERROR -] Cannot connect to server (localhost:%i)\n", SERVER_PORT);
- fprintf(stderr, "[ERROR -] ", giSyscall_ClientID);
perror("_InitSyscalls");
#if __WIN32__
closesocket(gSocket);
}
#endif
- #if !USE_TCP
+ #if USE_TCP
+ {
+ tRequestAuthHdr auth;
+ auth.pid = giSyscall_ClientID;
+ SendData(&auth, sizeof(auth));
+ int len = ReadData(&auth, sizeof(auth), 5);
+ if( len == 0 ) {
+ fprintf(stderr, "Timeout waiting for auth response\n");
+ exit(-1);
+ }
+ giSyscall_ClientID = auth.pid;
+ }
+ #else
// Ask server for a client ID
if( !giSyscall_ClientID )
{
data += sizeof(uint32_t);
break;
case ARG_TYPE_INT64:
- DEBUG_S(" 0x%016llx", *(uint64_t*)data);
+ DEBUG_S(" 0x%016"PRIx64"", *(uint64_t*)data);
data += sizeof(uint64_t);
break;
case ARG_TYPE_STRING:
int len;
#if USE_TCP
- len = send(Data, Length, 0);
+ len = send(gSocket, Data, Length, 0);
#else
len = sendto(gSocket, Data, Length, 0,
(struct sockaddr*)&gSyscall_ServerAddr, sizeof(gSyscall_ServerAddr));