Skip to content

Commit 2a696f2

Browse files
authored
Fix disconnect issue under cygwin + Formatting (#9000)
1 parent 2d7a057 commit 2a696f2

File tree

1 file changed

+24
-25
lines changed

1 file changed

+24
-25
lines changed

src/main/drivers/serial_tcp.c

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ static int lookup_address (char *name, int port, int type, struct sockaddr *addr
5252
struct addrinfo *servinfo, *p;
5353
struct addrinfo hints = {.ai_family = AF_UNSPEC, .ai_socktype = type, .ai_flags = AI_V4MAPPED|AI_ADDRCONFIG};
5454
if (name == NULL) {
55-
hints.ai_flags |= AI_PASSIVE;
55+
hints.ai_flags |= AI_PASSIVE;
5656
}
5757
/*
5858
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
7373
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(result));
7474
return result;
7575
} 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);
9191
}
9292
return 0;
9393
}
@@ -97,11 +97,11 @@ static char *tcpGetAddressString(struct sockaddr *addr)
9797
static char straddr[INET6_ADDRSTRLEN];
9898
void *ipaddr;
9999
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;
102102
} 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;
105105
}
106106
const char *res = inet_ntop(addr->sa_family, ipaddr, straddr, sizeof straddr);
107107
return (char *)res;
@@ -133,7 +133,7 @@ static tcpPort_t *tcpReConfigure(tcpPort_t *port, uint32_t id)
133133

134134
uint16_t tcpPort = BASE_IP_ADDRESS + id - 1;
135135
if (lookup_address(NULL, tcpPort, SOCK_STREAM, (struct sockaddr*)&port->sockAddress, &sockaddrlen) != 0) {
136-
return NULL;
136+
return NULL;
137137
}
138138
port->socketFd = socket(((struct sockaddr*)&port->sockAddress)->sa_family, SOCK_STREAM, IPPROTO_TCP);
139139

@@ -196,7 +196,7 @@ int tcpReceive(tcpPort_t *port)
196196
return -1;
197197
}
198198

199-
socklen_t addrLen = sizeof(struct sockaddr_storage);
199+
socklen_t addrLen = sizeof(struct sockaddr_storage);
200200
port->clientSocketFd = accept(port->socketFd,(struct sockaddr*)&port->clientAddress, &addrLen);
201201
if (port->clientSocketFd < 1) {
202202
fprintf(stderr, "[SOCKET] Can't accept connection.\n");
@@ -210,9 +210,8 @@ int tcpReceive(tcpPort_t *port)
210210
uint8_t buffer[TCP_BUFFER_SIZE];
211211
ssize_t recvSize = recv(port->clientSocketFd, buffer, TCP_BUFFER_SIZE, 0);
212212

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))) {
216215
fprintf(stderr, "[SOCKET] %s disconnected from UART%d\n", tcpGetAddressString((struct sockaddr *)&port->clientAddress), port->id);
217216
close(port->clientSocketFd);
218217
memset(&port->clientAddress, 0, sizeof(port->clientAddress));

0 commit comments

Comments
 (0)