@@ -52,7 +52,7 @@ static int lookup_address (char *name, int port, int type, struct sockaddr *addr
52
52
struct addrinfo * servinfo , * p ;
53
53
struct addrinfo hints = {.ai_family = AF_UNSPEC , .ai_socktype = type , .ai_flags = AI_V4MAPPED |AI_ADDRCONFIG };
54
54
if (name == NULL ) {
55
- hints .ai_flags |= AI_PASSIVE ;
55
+ hints .ai_flags |= AI_PASSIVE ;
56
56
}
57
57
/*
58
58
This nonsense is to uniformly deliver the same sa_family regardless of whether
@@ -73,21 +73,21 @@ static int lookup_address (char *name, int port, int type, struct sockaddr *addr
73
73
fprintf (stderr , "getaddrinfo: %s\n" , gai_strerror (result ));
74
74
return result ;
75
75
} else {
76
- for (p = servinfo ; p != NULL ; p = p -> ai_next ) {
77
- if (p -> ai_family == AF_INET6 )
78
- p6 = p ;
79
- else if (p -> ai_family == AF_INET )
80
- p4 = p ;
81
- }
82
- if (p6 != NULL )
83
- p = p6 ;
84
- else if (p4 != NULL )
85
- p = p4 ;
86
- else
87
- return -1 ;
88
- memcpy (addr , p -> ai_addr , p -> ai_addrlen );
89
- * len = p -> ai_addrlen ;
90
- freeaddrinfo (servinfo );
76
+ for (p = servinfo ; p != NULL ; p = p -> ai_next ) {
77
+ if (p -> ai_family == AF_INET6 )
78
+ p6 = p ;
79
+ else if (p -> ai_family == AF_INET )
80
+ p4 = p ;
81
+ }
82
+ if (p6 != NULL )
83
+ p = p6 ;
84
+ else if (p4 != NULL )
85
+ p = p4 ;
86
+ else
87
+ return -1 ;
88
+ memcpy (addr , p -> ai_addr , p -> ai_addrlen );
89
+ * len = p -> ai_addrlen ;
90
+ freeaddrinfo (servinfo );
91
91
}
92
92
return 0 ;
93
93
}
@@ -97,11 +97,11 @@ static char *tcpGetAddressString(struct sockaddr *addr)
97
97
static char straddr [INET6_ADDRSTRLEN ];
98
98
void * ipaddr ;
99
99
if (addr -> sa_family == AF_INET6 ) {
100
- struct sockaddr_in6 * ip = (struct sockaddr_in6 * )addr ;
101
- ipaddr = & ip -> sin6_addr ;
100
+ struct sockaddr_in6 * ip = (struct sockaddr_in6 * )addr ;
101
+ ipaddr = & ip -> sin6_addr ;
102
102
} else {
103
- struct sockaddr_in * ip = (struct sockaddr_in * )addr ;
104
- ipaddr = & ip -> sin_addr ;
103
+ struct sockaddr_in * ip = (struct sockaddr_in * )addr ;
104
+ ipaddr = & ip -> sin_addr ;
105
105
}
106
106
const char * res = inet_ntop (addr -> sa_family , ipaddr , straddr , sizeof straddr );
107
107
return (char * )res ;
@@ -133,7 +133,7 @@ static tcpPort_t *tcpReConfigure(tcpPort_t *port, uint32_t id)
133
133
134
134
uint16_t tcpPort = BASE_IP_ADDRESS + id - 1 ;
135
135
if (lookup_address (NULL , tcpPort , SOCK_STREAM , (struct sockaddr * )& port -> sockAddress , & sockaddrlen ) != 0 ) {
136
- return NULL ;
136
+ return NULL ;
137
137
}
138
138
port -> socketFd = socket (((struct sockaddr * )& port -> sockAddress )-> sa_family , SOCK_STREAM , IPPROTO_TCP );
139
139
@@ -196,7 +196,7 @@ int tcpReceive(tcpPort_t *port)
196
196
return -1 ;
197
197
}
198
198
199
- socklen_t addrLen = sizeof (struct sockaddr_storage );
199
+ socklen_t addrLen = sizeof (struct sockaddr_storage );
200
200
port -> clientSocketFd = accept (port -> socketFd ,(struct sockaddr * )& port -> clientAddress , & addrLen );
201
201
if (port -> clientSocketFd < 1 ) {
202
202
fprintf (stderr , "[SOCKET] Can't accept connection.\n" );
@@ -210,9 +210,8 @@ int tcpReceive(tcpPort_t *port)
210
210
uint8_t buffer [TCP_BUFFER_SIZE ];
211
211
ssize_t recvSize = recv (port -> clientSocketFd , buffer , TCP_BUFFER_SIZE , 0 );
212
212
213
- // Disconnect
214
- if (port -> isClientConnected && recvSize == 0 )
215
- {
213
+ // recv() under cygwin does not recognise the closed connection under certain circumstances, but returns ECONNRESET as an error.
214
+ if (port -> isClientConnected && (recvSize == 0 || ( recvSize == -1 && errno == ECONNRESET ))) {
216
215
fprintf (stderr , "[SOCKET] %s disconnected from UART%d\n" , tcpGetAddressString ((struct sockaddr * )& port -> clientAddress ), port -> id );
217
216
close (port -> clientSocketFd );
218
217
memset (& port -> clientAddress , 0 , sizeof (port -> clientAddress ));
0 commit comments