#include "trberror.h"
/* Error Handling */
-
+#define NUM_ERRORS 39
int trb_errno = TRB_NONE;
TRB_TERM trb_term = {0, 0, 0, 0};
"Pexor Device Error ioctl call, Lost Credential(s)",
"Pexor Device Error ioctl call, FIFO Transfer Error",
"Command is not supported by TRB3",
- "TRB3 Socket Error"
+ "TRB3 Socket Error",
+ "TRB3 Socket Timeout"
};
- if (trberrno < 38) {
+ if (trberrno < NUM_ERRORS) {
return errorstring[trberrno];
}
if (trberrno >= 256) {
TRB_PEXOR_DEVICE_LOST_CREDENTIAL = 34,
TRB_PEXOR_DEVICE_FIFO_TRANSFER = 35,
TRB_TRB3_CMD_NOT_SUPPORTED = 36,
- TRB_TRB3_SOCKET_ERROR = 37
+ TRB_TRB3_SOCKET_ERROR = 37,
+ TRB_TRB3_SOCKET_TIMEOUT = 38
} TRB_ERROR;
/* last TRBNet-TermPackage */
-const char trbnet_version[] = "$Revision: 4.22 $ Local";
+const char trbnet_version[] = "$Revision: 4.23 $ Local";
#include <stdlib.h>
#include <signal.h>
/* GetData */
status = recv(trb3_sockfd_in, (void*)dataBuffer, 1500, 0);
if (status == -1) {
- trb_errno = TRB_TRB3_SOCKET_ERROR;
+ trb_errno = errno == EAGAIN
+ ? TRB_TRB3_SOCKET_TIMEOUT
+ : TRB_TRB3_SOCKET_ERROR;
return -1;
}
dataBufferSize = status / 2;
/* Adjust endianess ... */
for (i = 0; i < size; i++) {
if (trb_debug > 2) {
+ if (i == 0) {
+ fprintf(stderr, "udp sent:\n");
+ }
fprintf(stderr, "%d 0x%04x\n", i, udpBuffer[i]);
}
udpBuffer[i] = htons(udpBuffer[i]);
if (getUDPPackage() <= 0) {
return -1;
}
- }
- tmp = dataBuffer;
+ tmp = dataBuffer;
+ } else {
+ tmp++;
+ }
#endif
} /* end while () */
struct sockaddr_in sender_addr;
struct sockaddr_in receiver_addr;
struct hostent* host = NULL;
+ struct timeval tv;
trb_errno = TRB_NONE;
trb_errno = TRB_TRB3_SOCKET_ERROR;
return -1;
}
+
+ /* Set Socket Timepout */
+ tv.tv_sec = 10; /* 30 Secs Timeout */
+ tv.tv_usec = 0; // Not init'ing this can cause strange errors
+ setsockopt(trb3_sockfd_in, SOL_SOCKET, SO_RCVTIMEO,
+ (char *)&tv,sizeof(struct timeval));
+
receiver_addr.sin_family = AF_INET;
receiver_addr.sin_port = htons(trb3_port);
receiver_addr.sin_addr.s_addr = htonl(INADDR_ANY);