-set socket options before “socket.bind” -listen for incoming SOCK_STREAM connections only before “socket.accept” resolves ubuntu errors.

Fork of NSAPITests by NetworkSocketAPI

Files at this revision

API Documentation at this revision

Comitter:
Christopher Haster
Date:
Wed Mar 02 18:02:47 2016 -0600
Parent:
3:8b595ee6219d
Child:
5:03b0570b4c29
Commit message:
Changed to just an echo server

Changed in this revision

EchoServer.py Show annotated file Show diff for this revision Revisions of this file
NSAPITestServer.py Show diff for this revision Revisions of this file
NSAPITests.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EchoServer.py	Wed Mar 02 18:02:47 2016 -0600
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+import socket
+import signal
+import select
+
+
+def main(port):
+    port = int(port)
+
+    udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+    udp.bind(('', port))
+    udp.setblocking(0)
+    udp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+
+    tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    tcp.bind(('', port))
+    tcp.setblocking(0)
+    tcp.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+    tcp.listen(5)
+
+    print "running on port %d" % port     
+    sockets = [tcp, udp]
+    clients = []
+
+    while True:
+        select.select(sockets, [], [])
+
+        try:
+            data, addr = udp.recvfrom(1 << 12)
+            print 'udp %s:%d %d' % (addr[0], addr[1], len(data))
+            udp.sendto(data, addr)
+        except socket.error:
+            pass
+
+        try:
+            client, addr = tcp.accept()
+            print 'tcp %s:%d connect' % (addr[0], addr[1])
+            client.setblocking(0)
+            client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+            sockets.append(client)
+            clients.append((client, addr))
+        except socket.error:
+            pass
+
+        for client, addr in clients:
+            try:
+                data = client.recv(1 << 12)
+                if data:
+                    print 'tcp %s:%d %d' % (addr[0], addr[1], len(data))
+                    client.send(data)
+                else:
+                    print 'tcp %s:%d disconnect' % (addr[0], addr[1])
+                    sockets.remove(client)
+                    clients.remove((client, addr))
+                    client.close()
+            except socket.error:
+                pass
+
+    
+if __name__ == "__main__":
+    import sys
+    main(*sys.argv[1:])
--- a/NSAPITestServer.py	Wed Mar 02 16:16:25 2016 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,92 +0,0 @@
-#!/usr/bin/env python
-import socket
-import signal
-import sys
-
-runServer = True
-
-def signal_handler(signal, frame):
-    global runServer
-
-    print "Handling interrupt"
-    runServer = False
-
-def handle_recv(message) :
-    if message == "{{start}}":
-        return None
-    else:
-        return message
-
-
-def run_tcp_server(port):
-    global runServer
-
-    host = 'localhost'
-    backlog = 5
-    size = 1024
-    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-    tcp_socket.settimeout(1.0)
-    tcp_socket.bind((host,port))
-    tcp_socket.listen(backlog)
-
-    while runServer:
-        try:
-            client, address = tcp_socket.accept()
-            data = client.recv(size)
-            if data:
-                print "TCP DATA from %s: %s" % (address, data)
-                message = handle_recv(data)
-                if message:
-                    client.send(message)
-                    client.close()
-        except socket.timeout:
-            pass
-        except IOError:
-            pass
-
-
-def run_udp_server(port):
-    global runServer
-
-    host = 'localhost'
-    backlog = 5
-    size = 1024
-    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
-    udp_socket.settimeout(1.0)
-    udp_socket.bind((host,port))
-
-
-    while runServer:
-        try:
-            data, address = udp_socket.recvfrom(size)
-            if data:
-                print "UDP DATA from %s: %s" % (addr, data)
-                message = handle_recv(data)
-                if message:
-                    udp_socket.sendto(message, address)
-        except socket.timeout:
-            pass
-        except IOError:
-            pass
-
-
-def main(arguments):
-    global thread_stop_event
-
-    signal.signal(signal.SIGINT, signal_handler)
-
-    socket_type = arguments[0]
-    port = int(arguments[1])
-
-    if socket_type == "TCP":
-        run_tcp_server(port)
-    elif socket_type == "UDP":
-        run_udp_server(port)
-    else:
-        print "Invalid socket type, must be 'TCP' or 'UDP'"
-        sys.exit(1)
-
-    sys.exit(0)
-
-if __name__ == "__main__":
-    main(sys.argv[1:])
\ No newline at end of file
--- a/NSAPITests.cpp	Wed Mar 02 16:16:25 2016 -0600
+++ b/NSAPITests.cpp	Wed Mar 02 18:02:47 2016 -0600
@@ -101,7 +101,7 @@
 int nsapi_socket_send_test(Socket *socket, const char *test_address, uint16_t test_port)
 {
   char data[] = "{{start}}";
-  int32_t ret = socket->send(data, sizeof(data));
+  int32_t ret = socket->send(data, strlen(data));
 
   if (ret) {
     printf("'send' failed with code %d\r\n", ret);
@@ -116,7 +116,7 @@
   char expected_data[] = "{{data}}";
   char data[100] = {0};
 
-  int32_t ret = socket->send(data, sizeof(data));
+  int32_t ret = socket->send(expected_data, strlen(expected_data));
 
   if (ret) {
     printf("'send' failed during 'recv' test with code %d\r\n", ret);
@@ -125,7 +125,7 @@
 
   int32_t bytes_received = socket->recv(data, sizeof(data));
 
-  if (bytes_received >= (int32_t)sizeof(expected_data)) {
+  if (bytes_received >= (int32_t)strlen(expected_data)) {
     if (strstr(data, expected_data) != NULL) {
       return 0;
     } else {
@@ -148,7 +148,7 @@
   char expected_data[] = "{{data}}";
   char data[100] = {0};
 
-  int32_t ret = socket->send(expected_data, sizeof(expected_data));
+  int32_t ret = socket->send(expected_data, strlen(expected_data));
 
   if (ret) {
     printf("'send' failed during 'recv' test with code %d\r\n", ret);
@@ -158,7 +158,7 @@
   for (int i = 0; i < 100; i++) {
     bytes_received = socket->recv(data, sizeof(data), false);
     
-    if (bytes_received >= (int32_t)sizeof(expected_data)) {
+    if (bytes_received >= (int32_t)strlen(expected_data)) {
       if (strstr(data, expected_data) != NULL) {
         result = 0;
         break;