Browse Source

trying to workaround

Stasik0 10 years ago
parent
commit
9dd8e8f2a7
1 changed files with 24 additions and 15 deletions
  1. 24 15
      examples/networklayer_tcp.c

+ 24 - 15
examples/networklayer_tcp.c

@@ -584,25 +584,34 @@ static UA_StatusCode ClientNetworkLayerTCP_awaitResponse(ClientNetworkLayerTCP *
 
     setsockopt(handle->sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tmptv,sizeof(struct timeval));
 
-    int ret = recv(handle->sockfd, (char*)response->data, response->length, 0);
+    int ret = 0;
 
-    if(ret <= -1)
-        return UA_STATUSCODE_BADINTERNALERROR;
-    if(ret == 0)
-        return UA_STATUSCODE_BADSERVERNOTCONNECTED;
+    unsigned int already_received = 0;
+    UA_SecureConversationMessageHeader msgHeader;
 
-    response->length = ret;
+    do{
 
-    //FIXME: receive even more
-    if(ret <= 4){
-    	return UA_STATUSCODE_BADINTERNALERROR;
-    }
+    	ret = recv(handle->sockfd, (char*)(response->data+already_received), response->length-already_received, 0);
 
-    size_t offset = 0;
-    //let us try to decode the length of the real message
-    UA_SecureConversationMessageHeader msgHeader;
-    UA_SecureConversationMessageHeader_decodeBinary(response, &offset, &msgHeader);
-    printf("ret %d, length %d\n", ret, msgHeader.messageHeader.messageSize);
+    	if(ret <= -1)
+    		return UA_STATUSCODE_BADINTERNALERROR;
+    	if(ret == 0)
+    		return UA_STATUSCODE_BADSERVERNOTCONNECTED;
+
+    	//FIXME: receive even more
+    	if(ret <= 4){
+    		return UA_STATUSCODE_BADINTERNALERROR;
+    	}
+
+    	already_received+=ret;
+
+    	size_t offset = 0;
+    	//let us try to decode the length of the real message
+    	UA_SecureConversationMessageHeader_decodeBinary(response, &offset, &msgHeader);
+    	printf("ret %d, length %d, already recv %d\n", ret, msgHeader.messageHeader.messageSize, already_received);
+    }while(msgHeader.messageHeader.messageSize < already_received);
+
+    response->length = already_received;
 
     return UA_STATUSCODE_GOOD;
 }