-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtcp_debug.c
executable file
·152 lines (140 loc) · 4.65 KB
/
tcp_debug.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#include "mhc.h"
/* Initialize TCP socket for listening
* to debug messages
* <return> <code>int</code>
* 0 socket is created for listening
* -1 socket creation failed
* -2 reuse of IP address failed
* -3 socket bind failed
* -4 socket listen failed
*/
int debugTcpInit() {
// Get TCP socket
if ((debugTcpSocket=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))==-1)
return -1;
// Set socket to reuse IP address
int param = 1;
if(setsockopt(debugTcpSocket, SOL_SOCKET, SO_REUSEADDR, ¶m, sizeof(int)) == -1)
return -2;
// Cleanup TCP socket structure
memset((char *)&debugTcpSocketServer, 0, sizeof(debugTcpSocketServer));
// Setup TCP socket
debugTcpSocketServer.sin_family = AF_INET;
debugTcpSocketServer.sin_port = htons(DEBUG_TCP_PORT);
debugTcpSocketServer.sin_addr.s_addr = htonl(INADDR_ANY);
// Bind TCP socket
if (bind(debugTcpSocket, (struct sockaddr *)&debugTcpSocketServer, sizeof(debugTcpSocketServer)) == -1)
return -3;
// Listen to TCP socket
if (listen(debugTcpSocket, TCP_QUEUE) == -1)
return -4;
return 0;
}
/* Close TCP socket receiver
*/
void debugTcpClose() {
close(debugTcpSocket);
tcpDebugUp = false;
}
/* Process received TCP packet
* <return> <code>int</code>
* 0 if packet could be processed
* -1 Empty packet received
*/
int debugTcpProcess() {
/* File pointer for debug */
FILE *fPtr;
#ifdef DO_DEBUG
// Write Log data
getSysTime(1);
// Pointer to log file
fPtr = fopen("/home/pi/mhcv.txt", "a"); // /home/pi on Raspian
fwrite(sysTime,20,1,fPtr);
dbgLen = sprintf(debugMsg,"debugTcpProcess: debugTcpProcess was called %s:%d\n\n", inet_ntoa(debugTcpSocketClient.sin_addr), ntohs(debugTcpSocketClient.sin_port));
fwrite(debugMsg,dbgLen,1,fPtr);
fclose(fPtr);
#endif
int debugTcpRecvBytes = recv(debugTcpClientSocket, debugTcpBuf, BUFLEN, 0);
if (debugTcpRecvBytes < 0) { // Receive failed
// Write Log data
getSysTime(1);
// Pointer to log file
fPtr = fopen("/home/pi/mhcv.txt", "a"); // /home/pi on Raspian
fwrite(sysTime,20,1,fPtr);
dbgLen = sprintf(debugMsg,"debugTcpProcess: Receive failed with error:%d\n\n", debugTcpRecvBytes);
fwrite(debugMsg,dbgLen,1,fPtr);
fclose(fPtr);
}
#ifdef DO_DEBUG
// Write Log data
getSysTime(1);
// Pointer to log file
fPtr = fopen("/home/pi/mhcv.txt", "a"); // /home/pi on Raspian
fwrite(sysTime,20,1,fPtr);
dbgLen = sprintf(debugMsg,"Received packet from %s:%d - Data: %s\n\n", inet_ntoa(debugTcpSocketClient.sin_addr), ntohs(debugTcpSocketClient.sin_port), debugTcpBuf);
fwrite(debugMsg,dbgLen,1,fPtr);
fclose(fPtr);
#endif
// TODO decide if we handle received data here or in the main thread
// Signal to main thread that we have received data
hasDebugTCPdata = true;
memcpy((char *) &debugTcpBufTemp, (char *) & debugTcpBuf, debugTcpRecvBytes);
debugTcpRecvBytesTemp = debugTcpRecvBytes;
// Close the communication socket
close(debugTcpClientSocket);
// Cleanup buffer
memset((char *) &debugTcpBuf, 0, BUFLEN);
raise(SIGUSR2);
return 0;
}
void *debugTcpServer(void *argument) {
/* File pointer for debug */
FILE *fPtr;
// Setup TCP listener
if ((resultValue = debugTcpInit()) != 0) {
// Write Log data
getSysTime(1);
// Pointer to log file
fPtr = fopen("/home/pi/mhcv.txt", "a"); // /home/pi on Raspian
fwrite(sysTime,20,1,fPtr);
dbgLen = sprintf(debugMsg,"debugTcpServer: TCP socket listener initialization failed with result %d\n", resultValue);
fwrite(debugMsg,dbgLen,1,fPtr);
fclose(fPtr);
if (resultValue == -2) {
debugTcpClose();
}
return (void *)&resultValue;
} else {
tcpDebugUp = true;
#ifdef DO_DEBUG
// Write Log data
getSysTime(1);
// Pointer to log file
fPtr = fopen("/home/pi/mhcv.txt", "a"); // /home/pi on Raspian
fwrite(sysTime,20,1,fPtr);
dbgLen = sprintf(debugMsg,"debugTcpServer: TCP socket listener initialized\n");
fwrite(debugMsg,dbgLen,1,fPtr);
fclose(fPtr);
#endif
}
int error = 0;
while (error == 0) {
// Check if there is an incoming TCP request
debugTcpBuffClient = BUFLEN;
debugTcpClientSocket = accept(debugTcpSocket, (struct sockaddr *)&debugTcpSocketClient, &debugTcpBuffClient);
if (debugTcpClientSocket > 0) {
resultValue = debugTcpProcess();
if (resultValue != 0) {
// Write Log data
getSysTime(1);
// Pointer to log file
fPtr = fopen("/home/pi/mhcv.txt", "a"); // /home/pi on Raspian
fwrite(sysTime,20,1,fPtr);
dbgLen = sprintf(debugMsg,"debugTcpServer: TCP packet process failed with result %d\n", resultValue);
fwrite(debugMsg,dbgLen,1,fPtr);
fclose(fPtr);
}
}
}
return (void *)&resultValue;
}