소스 검색

some more fixes in layer_udp

Stasik0 10 년 전
부모
커밋
8758830532
2개의 변경된 파일9개의 추가작업 그리고 14개의 파일을 삭제
  1. 5 7
      examples/networklayer_udp.c
  2. 4 7
      src/server/ua_server_worker.c

+ 5 - 7
examples/networklayer_udp.c

@@ -71,7 +71,6 @@ static UA_StatusCode setNonBlocking(int sockid) {
 	return UA_STATUSCODE_GOOD;
 }
 
-// after every select, reset the set of sockets we want to listen on
 static void setFDSet(NetworkLayerUDP *layer) {
 	FD_ZERO(&layer->fdset);
 	FD_SET(layer->serversockfd, &layer->fdset);
@@ -168,7 +167,7 @@ UA_StatusCode NetworkLayerUDP_start(NetworkLayerUDP *layer) {
 		CLOSESOCKET(layer->serversockfd);
 		return UA_STATUSCODE_BADINTERNALERROR;
 	}
-		
+
 	if(bind(layer->serversockfd, (const struct sockaddr *)&serv_addr,
             sizeof(serv_addr)) < 0) {
 		perror("binding");
@@ -187,17 +186,16 @@ UA_StatusCode NetworkLayerUDP_start(NetworkLayerUDP *layer) {
 UA_Int32 NetworkLayerUDP_getWork(NetworkLayerUDP *layer, UA_WorkItem **workItems,
                                  UA_UInt16 timeout) {
     UA_WorkItem *items = UA_NULL;
-    UA_Int32 itemsCount = 0;
     setFDSet(layer);
     struct timeval tmptv = {0, timeout};
     UA_Int32 resultsize = select(layer->serversockfd+1, &layer->fdset, NULL, NULL, &tmptv);
 
-    if(resultsize <= 0) {
+    if(resultsize <= 0 || !FD_ISSET(layer->serversockfd, &layer->fdset)) {
         *workItems = items;
-        return itemsCount;
+        return 0;
     }
 
-    items = malloc(sizeof(UA_WorkItem)*(itemsCount+resultsize));
+    items = malloc(sizeof(UA_WorkItem)*(resultsize));
 
 	// read from established sockets
     UA_Int32 j = 0;
@@ -213,7 +211,7 @@ UA_Int32 NetworkLayerUDP_getWork(NetworkLayerUDP *layer, UA_WorkItem **workItems
 		struct sockaddr sender;
 		socklen_t sendsize = sizeof(sender);
 		bzero(&sender, sizeof(sender));
-        
+
 #ifdef _WIN32
         buf.length = recvfrom(layer->conLinks[i].sockfd, (char *)buf.data,
                           layer->conf.recvBufferSize, 0);

+ 4 - 7
src/server/ua_server_worker.c

@@ -1,6 +1,4 @@
 #include <stdio.h>
-#define __USE_POSIX199309 //nanosleep
-#include <time.h> //nanosleep
 #include "ua_server_internal.h"
 
 /**
@@ -414,7 +412,10 @@ UA_StatusCode UA_Server_run(UA_Server *server, UA_UInt16 nThreads, UA_Boolean *r
             UA_WorkItem *work;
             UA_Int32 workSize;
             if(*running) {
-                    workSize = nl->getWork(nl->nlHandle, &work, 0);
+            	if(i == server->nlsSize-1)
+            		workSize = nl->getWork(nl->nlHandle, &work, timeout);
+            	else
+            		workSize = nl->getWork(nl->nlHandle, &work, 0);
             } else {
                 workSize = server->nls[i].stop(nl->nlHandle, &work);
             }
@@ -434,10 +435,6 @@ UA_StatusCode UA_Server_run(UA_Server *server, UA_UInt16 nThreads, UA_Boolean *r
 #endif
         }
 
-        struct timespec reqtime;
-        reqtime.tv_sec = 0;
-        reqtime.tv_nsec = timeout * 1000; //from us to ns
-        nanosleep(&reqtime, UA_NULL);
 
         // 3.3) Exit?
         if(!*running)