Просмотр исходного кода

simplify network error handling in the client

Julius Pfrommer лет назад: 9
Родитель
Сommit
b865250d6f
2 измененных файлов с 8 добавлено и 9 удалено
  1. 5 3
      examples/networklayer_tcp.c
  2. 3 6
      src/client/ua_client.c

+ 5 - 3
examples/networklayer_tcp.c

@@ -73,18 +73,20 @@ static UA_StatusCode socket_recv(UA_Connection *connection, UA_ByteString *respo
     int ret = recv(connection->sockfd, (char*)response->data, connection->localConf.recvBufferSize, 0);
 	if(ret == 0) {
 		UA_free(response->data);
-		connection->close(connection);
-		return UA_STATUSCODE_BADCONNECTIONCLOSED;
+        UA_ByteString_init(response);
+		return UA_STATUSCODE_GOOD; /* no response -> retry */
 	} else if(ret < 0) {
         UA_free(response->data);
+        UA_ByteString_init(response);
 #ifdef _WIN32
 		if(WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEWOULDBLOCK) {
 #else
 		if (errno == EAGAIN || errno == EWOULDBLOCK) {
 #endif
-            return UA_STATUSCODE_BADCOMMUNICATIONERROR;
+            return UA_STATUSCODE_GOOD; /* retry */
         } else {
             connection->close(connection);
+            connection->state = UA_CONNECTION_CLOSED;
             return UA_STATUSCODE_BADCONNECTIONCLOSED;
         }
     }

+ 3 - 6
src/client/ua_client.c

@@ -176,12 +176,11 @@ static UA_StatusCode SecureChannelHandshake(UA_Client *client, UA_Boolean renew)
         return retval;
     }
 
-    // parse the response
     UA_ByteString reply;
     UA_ByteString_init(&reply);
     do {
         retval = client->connection.recv(&client->connection, &reply, client->config.timeout);
-        if(retval == UA_STATUSCODE_GOOD)
+        if(retval != UA_STATUSCODE_GOOD)
             return retval;
     } while(!reply.data);
 
@@ -216,7 +215,6 @@ static UA_StatusCode SecureChannelHandshake(UA_Client *client, UA_Boolean renew)
     UA_OpenSecureChannelResponse_deleteMembers(&response);
     UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymHeader);
     return retval;
-
 }
 
 /** If the request fails, then the response is cast to UA_ResponseHeader (at the beginning of every
@@ -257,12 +255,11 @@ static void synchronousRequest(UA_Client *client, void *request, const UA_DataTy
     UA_ByteString_init(&reply);
     do {
         retval = client->connection.recv(&client->connection, &reply, client->config.timeout);
-        if(retval == UA_STATUSCODE_BADCONNECTIONCLOSED) {
-            client->connection.state = UA_CONNECTION_CLOSED;
+        if(retval != UA_STATUSCODE_GOOD) {
             respHeader->serviceResult = retval;
             return;
         }
-    } while(retval != UA_STATUSCODE_GOOD || reply.length == -1);
+    } while(!reply.data);
 
     size_t offset = 0;
     UA_SecureConversationMessageHeader msgHeader;