Преглед на файлове

final set of fixes for windows

Stasik0 преди 10 години
родител
ревизия
168fa087df
променени са 5 файла, в които са добавени 66 реда и са изтрити 61 реда
  1. 3 2
      examples/client.c
  2. 16 13
      examples/networklayer_tcp.c
  3. 1 1
      examples/server.c
  4. 9 11
      include/ua_client.h
  5. 37 34
      src/client/ua_client.c

+ 3 - 2
examples/client.c

@@ -21,7 +21,7 @@ int main(int argc, char *argv[]) {
     //UA_String_copycstring("Demo.Static.Scalar.Int32", &node.identifier.string);
     node.namespaceIndex = 1;
     node.identifierType = UA_NODEIDTYPE_NUMERIC;
-    node.identifier.numeric = 76;
+    node.identifier.numeric = 442;
 
     UA_ReadRequest read_req;
     UA_ReadRequest_init(&read_req);
@@ -30,7 +30,8 @@ int main(int argc, char *argv[]) {
     read_req.nodesToReadSize = 1;
     read_req.nodesToRead[0].nodeId = node;
     read_req.nodesToRead[0].attributeId = UA_ATTRIBUTEID_VALUE;
-    UA_ReadResponse read_resp = UA_Client_read(client, &read_req);
+    UA_ReadResponse read_resp;
+    UA_Client_read(client, &read_req, &read_resp);
     printf("the answer is: %i\n", *(UA_Int32*)read_resp.results[0].value.dataPtr);
     UA_ReadRequest_deleteMembers(&read_req);
     UA_ReadResponse_deleteMembers(&read_resp);

+ 16 - 13
examples/networklayer_tcp.c

@@ -282,10 +282,6 @@ void writeCallback(TCPConnection *handle, UA_ByteStringArray gather_buf) {
 
 static UA_StatusCode ServerNetworkLayerTCP_start(ServerNetworkLayerTCP *layer, UA_Logger *logger) {
 #ifdef _WIN32
-	WORD wVersionRequested;
-	WSADATA wsaData;
-	wVersionRequested = MAKEWORD(2, 2);
-	WSAStartup(wVersionRequested, &wsaData);
 	if((layer->serversockfd = socket(PF_INET, SOCK_STREAM,0)) == INVALID_SOCKET) {
 		printf("ERROR opening socket, code: %d\n", WSAGetLastError());
 		return UA_STATUSCODE_BADINTERNALERROR;
@@ -412,6 +408,12 @@ static void ServerNetworkLayerTCP_delete(ServerNetworkLayerTCP *layer) {
 }
 
 UA_ServerNetworkLayer ServerNetworkLayerTCP_new(UA_ConnectionConfig conf, UA_UInt32 port) {
+#ifdef _WIN32
+	WORD wVersionRequested;
+	WSADATA wsaData;
+	wVersionRequested = MAKEWORD(2, 2);
+	WSAStartup(wVersionRequested, &wsaData);
+#endif
     ServerNetworkLayerTCP *tcplayer = malloc(sizeof(ServerNetworkLayerTCP));
 	tcplayer->conf = conf;
 	tcplayer->conLinksSize = 0;
@@ -505,24 +507,24 @@ static UA_StatusCode ClientNetworkLayerTCP_connect(const UA_String endpointUrl,
 
 	server_addr.sin_family = AF_INET;
 	server_addr.sin_port = htons(port);
-
 	if(connect(sock, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
         printf("Connect failed.\n");
         return UA_STATUSCODE_BADINTERNALERROR;
     }
-
     //if(setNonBlocking(*sock) != UA_STATUSCODE_GOOD) {
     //    printf("Could not switch to nonblocking.\n");
     //	FINALLY
     //    return UA_STATUSCODE_BADINTERNALERROR;
     //}
-
     resultHandle->sockfd = sock;
     return UA_STATUSCODE_GOOD;
 }
 
 static void ClientNetworkLayerTCP_disconnect(ClientNetworkLayerTCP* handle) {
 	CLOSESOCKET(handle->sockfd);
+#ifdef _WIN32
+	WSACleanup();
+#endif
 }
 
 static UA_StatusCode ClientNetworkLayerTCP_send(ClientNetworkLayerTCP *handle, UA_ByteStringArray gather_buf) {
@@ -567,17 +569,18 @@ static UA_StatusCode ClientNetworkLayerTCP_send(ClientNetworkLayerTCP *handle, U
 
 static UA_StatusCode ClientNetworkLayerTCP_awaitResponse(ClientNetworkLayerTCP *handle, UA_ByteString *response,
                                                          UA_UInt32 timeout) {
-    FD_ZERO(&handle->read_fds);
-    FD_SET(handle->sockfd, &handle->read_fds);//tcp socket
+    //FD_ZERO(&handle->read_fds);
+    //FD_SET(handle->sockfd, &handle->read_fds);//tcp socket
     struct timeval tmptv = {0, timeout};
-    tmptv.tv_sec = 10;
-    int ret = select(handle->sockfd+1, &handle->read_fds, NULL, NULL, &tmptv);
+    /*int ret = select(handle->sockfd+1, &handle->read_fds, NULL, NULL, &tmptv);
     if(ret <= -1)
         return UA_STATUSCODE_BADINTERNALERROR;
     if(ret == 0)
-        return UA_STATUSCODE_BADTIMEOUT;
+        return UA_STATUSCODE_BADTIMEOUT;*/
+
+    setsockopt(handle->sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tmptv,sizeof(struct timeval));
 
-    ret = recv(handle->sockfd, (char*)response->data, response->length, 0);
+    int ret = recv(handle->sockfd, (char*)response->data, response->length, 0);
 
     if(ret <= -1)
         return UA_STATUSCODE_BADINTERNALERROR;

+ 1 - 1
examples/server.c

@@ -235,7 +235,7 @@ int main(int argc, char** argv) {
     UA_Variant_setScalarCopy(myIntegerVariant, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
     UA_QualifiedName myIntegerName;
     UA_QUALIFIEDNAME_ASSIGN(myIntegerName, "the answer");
-    UA_NodeId myIntegerNodeId = UA_NODEID_NULL; /* assign a random free nodeid */
+    UA_NodeId myIntegerNodeId = UA_NODEID_STATIC(1, 442);
     UA_NodeId parentNodeId = UA_NODEID_STATIC(0, UA_NS0ID_OBJECTSFOLDER);
     UA_NodeId parentReferenceNodeId = UA_NODEID_STATIC(0, UA_NS0ID_ORGANIZES);
     UA_Server_addVariableNode(server, myIntegerVariant, myIntegerName,

+ 9 - 11
include/ua_client.h

@@ -38,21 +38,19 @@ UA_StatusCode UA_EXPORT UA_Client_disconnect(UA_Client *client);
 
 /* Attribute Service Set */
 //TODO: had to remove const from the 2nd argument
-UA_ReadResponse UA_EXPORT UA_Client_read(UA_Client *client, UA_ReadRequest *request);
-UA_WriteResponse UA_EXPORT UA_Client_write(UA_Client *client, const UA_WriteRequest *request);
+UA_StatusCode UA_EXPORT UA_Client_read(UA_Client *client, UA_ReadRequest *request, UA_ReadResponse *response);
+
+UA_StatusCode UA_EXPORT UA_Client_write(UA_Client *client, UA_WriteRequest *request, UA_WriteResponse *response);
 
 /* View Service Set */    
-UA_BrowseResponse UA_EXPORT UA_Client_browse(UA_Client *client, const UA_BrowseRequest *request);
-UA_TranslateBrowsePathsToNodeIdsResponse UA_EXPORT UA_Client_translateBrowsePathsToNodeIds(UA_Client *client,
-                                                        const UA_TranslateBrowsePathsToNodeIdsRequest *request);
+UA_StatusCode UA_EXPORT UA_Client_browse(UA_Client *client, UA_BrowseRequest *request, UA_BrowseResponse *response);
+UA_StatusCode UA_EXPORT UA_Client_translateBrowsePathsToNodeIds(UA_Client *client, UA_TranslateBrowsePathsToNodeIdsRequest *request, UA_TranslateBrowsePathsToNodeIdsResponse* response);
 
 /* NodeManagement Service Set */
-UA_AddNodesResponse UA_EXPORT UA_Client_addNodes(UA_Client *client, const UA_AddNodesRequest *request);
-UA_AddReferencesResponse UA_EXPORT
-    UA_Client_addReferences(UA_Client *client, const UA_AddReferencesRequest *request);
-UA_DeleteNodesResponse UA_EXPORT UA_Client_deleteNodes(UA_Client *client, const UA_DeleteNodesRequest *request);
-UA_DeleteReferencesResponse UA_EXPORT
-    UA_Client_deleteReferences(UA_Client *client, const UA_DeleteReferencesRequest *request);
+UA_StatusCode UA_EXPORT UA_Client_addNodes(UA_Client *client, UA_AddNodesRequest *request, UA_AddNodesResponse* response);
+UA_StatusCode UA_EXPORT UA_Client_addReferences(UA_Client *client, UA_AddReferencesRequest *request, UA_AddReferencesResponse* response);
+UA_StatusCode UA_EXPORT UA_Client_deleteNodes(UA_Client *client, UA_DeleteNodesRequest *request, UA_DeleteNodesResponse* response);
+UA_StatusCode UA_EXPORT UA_Client_deleteReferences(UA_Client *client, UA_DeleteReferencesRequest *request, UA_DeleteReferencesResponse* response);
     
 #ifdef __cplusplus
 } // extern "C"

+ 37 - 34
src/client/ua_client.c

@@ -427,63 +427,66 @@ UA_StatusCode UA_EXPORT UA_Client_disconnect(UA_Client *client) {
     return retval;
 }
 
-UA_ReadResponse UA_Client_read(UA_Client *client, UA_ReadRequest *request) {
-    UA_ReadResponse response;
+UA_StatusCode UA_Client_read(UA_Client *client, UA_ReadRequest *request, UA_ReadResponse *response) {
     //todo: probably move to synchronousRequest
     UA_NodeId_copy(&client->authenticationToken, &request->requestHeader.authenticationToken);
-    synchronousRequest(request, &UA_TYPES[UA_TYPES_READREQUEST], &response,
+    synchronousRequest(request, &UA_TYPES[UA_TYPES_READREQUEST], response,
                        &UA_TYPES[UA_TYPES_READRESPONSE], client);
-    return response;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_WriteResponse UA_Client_write(UA_Client *client, const UA_WriteRequest *request) {
-    UA_WriteResponse response;
-    synchronousRequest(request, &UA_TYPES[UA_TYPES_WRITEREQUEST], &response,
+UA_StatusCode UA_Client_write(UA_Client *client, UA_WriteRequest *request, UA_WriteResponse *response) {
+	//todo: probably move to synchronousRequest
+    UA_NodeId_copy(&client->authenticationToken, &request->requestHeader.authenticationToken);
+    synchronousRequest(request, &UA_TYPES[UA_TYPES_WRITEREQUEST], response,
                        &UA_TYPES[UA_TYPES_WRITERESPONSE], client);
-    return response;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_BrowseResponse UA_Client_browse(UA_Client *client, const UA_BrowseRequest *request) {
-    UA_BrowseResponse response;
-    synchronousRequest(request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], &response,
+UA_StatusCode UA_Client_browse(UA_Client *client, UA_BrowseRequest *request, UA_BrowseResponse *response) {
+	//todo: probably move to synchronousRequest
+    UA_NodeId_copy(&client->authenticationToken, &request->requestHeader.authenticationToken);
+    synchronousRequest(request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], response,
                        &UA_TYPES[UA_TYPES_BROWSERESPONSE], client);
-    return response;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_TranslateBrowsePathsToNodeIdsResponse
-UA_Client_translateBrowsePathsToNodeIds(UA_Client *client,
-                                        const UA_TranslateBrowsePathsToNodeIdsRequest *request) {
-    UA_TranslateBrowsePathsToNodeIdsResponse response;
-    synchronousRequest(request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], &response,
+UA_StatusCode UA_Client_translateBrowsePathsToNodeIds(UA_Client *client, UA_TranslateBrowsePathsToNodeIdsRequest *request, UA_TranslateBrowsePathsToNodeIdsResponse* response){
+	//todo: probably move to synchronousRequest
+	UA_NodeId_copy(&client->authenticationToken, &request->requestHeader.authenticationToken);
+    synchronousRequest(request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], response,
                        &UA_TYPES[UA_TYPES_BROWSERESPONSE], client);
-    return response;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_AddNodesResponse UA_Client_addNodes(UA_Client *client, const UA_AddNodesRequest *request) {
-    UA_AddNodesResponse response;
-    synchronousRequest(request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], &response,
+UA_StatusCode UA_Client_addNodes(UA_Client *client, UA_AddNodesRequest *request, UA_AddNodesResponse* response) {
+	//todo: probably move to synchronousRequest
+	UA_NodeId_copy(&client->authenticationToken, &request->requestHeader.authenticationToken);
+    synchronousRequest(request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], response,
                        &UA_TYPES[UA_TYPES_BROWSERESPONSE], client);
-    return response;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_AddReferencesResponse UA_Client_addReferences(UA_Client *client, const UA_AddReferencesRequest *request) {
-    UA_AddReferencesResponse response;
-    synchronousRequest(request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], &response,
+UA_StatusCode UA_Client_addReferences(UA_Client *client, UA_AddReferencesRequest *request, UA_AddReferencesResponse* response) {
+	//todo: probably move to synchronousRequest
+	UA_NodeId_copy(&client->authenticationToken, &request->requestHeader.authenticationToken);
+    synchronousRequest(request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], response,
                        &UA_TYPES[UA_TYPES_BROWSERESPONSE], client);
-    return response;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_DeleteNodesResponse UA_Client_deleteNodes(UA_Client *client, const UA_DeleteNodesRequest *request) {
-    UA_DeleteNodesResponse response;
+UA_StatusCode UA_Client_deleteNodes(UA_Client *client, UA_DeleteNodesRequest *request, UA_DeleteNodesResponse* response) {
+	//todo: probably move to synchronousRequest
+	UA_NodeId_copy(&client->authenticationToken, &request->requestHeader.authenticationToken);
     synchronousRequest(request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], &response,
                        &UA_TYPES[UA_TYPES_BROWSERESPONSE], client);
-    return response;
+    return UA_STATUSCODE_GOOD;
 }
 
-UA_DeleteReferencesResponse UA_Client_deleteReferences(UA_Client *client,
-                                                       const UA_DeleteReferencesRequest *request) {
-    UA_DeleteReferencesResponse response;
-    synchronousRequest(request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], &response,
+UA_StatusCode UA_Client_deleteReferences(UA_Client *client, UA_DeleteReferencesRequest *request, UA_DeleteReferencesResponse* response) {
+	//todo: probably move to synchronousRequest
+	UA_NodeId_copy(&client->authenticationToken, &request->requestHeader.authenticationToken);
+    synchronousRequest(request, &UA_TYPES[UA_TYPES_BROWSEREQUEST], response,
                        &UA_TYPES[UA_TYPES_BROWSERESPONSE], client);
-    return response;
+    return UA_STATUSCODE_GOOD;
 }