You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ch...@apache.org on 2020/10/20 15:44:15 UTC

[qpid-dispatch] branch dev-protocol-adaptors-2 updated: DISPATCH-1807: TCP adaptor test echo server

This is an automated email from the ASF dual-hosted git repository.

chug pushed a commit to branch dev-protocol-adaptors-2
in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git


The following commit(s) were added to refs/heads/dev-protocol-adaptors-2 by this push:
     new eccba23  DISPATCH-1807: TCP adaptor test echo server
eccba23 is described below

commit eccba23ad05df2490e23790ea6690eee41bd99f4
Author: Chuck Rolke <ch...@apache.org>
AuthorDate: Thu Oct 15 19:26:35 2020 -0400

    DISPATCH-1807: TCP adaptor test echo server
---
 tests/TCP_echo_server.py | 120 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 120 insertions(+)

diff --git a/tests/TCP_echo_server.py b/tests/TCP_echo_server.py
new file mode 100755
index 0000000..61e95a2
--- /dev/null
+++ b/tests/TCP_echo_server.py
@@ -0,0 +1,120 @@
+#!/usr/bin/env python
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+import argparse
+import os
+import selectors
+import socket
+import sys
+import traceback
+import types
+
+from system_test import Logger
+
+HOST = '127.0.0.1'
+
+def main_except(port, logger):
+    '''
+    :param port: port to listen on
+    :param logger: Logger() object
+    :return:
+    '''
+    # set up listening socket
+    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    sock.bind((HOST, port))
+    sock.listen()
+    sock.setblocking(False)
+    logger.log('Listening on host:%s, port:%d' % (HOST, port))
+
+    # set up selector
+    sel = selectors.DefaultSelector()
+    sel.register(sock, selectors.EVENT_READ, data=None)
+
+    # event loop
+    while True:
+        events = sel.select(timeout=None)
+        for key, mask in events:
+            if key.data is None:
+                do_accept(key.fileobj, sel, logger)
+            else:
+                do_service(key, mask, sel, logger)
+
+def do_accept(sock, sel, logger):
+    conn, addr = sock.accept()
+    logger.log('Accepted connection from %s:%d' % (addr[0], addr[1]))
+    conn.setblocking(False)
+    data = types.SimpleNamespace(addr=addr, inb=b'', outb=b'')
+    events = selectors.EVENT_READ | selectors.EVENT_WRITE
+    sel.register(conn, events, data=data)
+
+def do_service(key, mask, sel, logger):
+    sock = key.fileobj
+    data = key.data
+    if mask & selectors.EVENT_READ:
+        recv_data = sock.recv(1024)
+        if recv_data:
+            data.outb += recv_data
+            logger.log('ECHO read from: %s:%d len:%d: %s' % (data.addr[0], data.addr[1], len(recv_data), repr(recv_data)))
+        else:
+            logger.log('Closing connection to %s:%d' % (data.addr[0], data.addr[1]))
+            sel.unregister(sock)
+            sock.close()
+    if mask & selectors.EVENT_WRITE:
+        if data.outb:
+            sent = sock.send(data.outb)
+            if sent > 0:
+                logger.log('ECHO write to : %s:%d len:%d: %s' % (data.addr[0], data.addr[1], sent, repr(data.outb[:sent])))
+            else:
+                logger.log('ECHO write to : %s:%d len:0' % (data.addr[0], data.addr[1]))
+            data.outb = data.outb[sent:]
+
+
+def main(argv):
+    try:
+        # parse args
+        p = argparse.ArgumentParser()
+        p.add_argument('--port', '-p',
+                       help='Required listening port number')
+        p.add_argument('--log', '-l',
+                       action='store_true',
+                       help='Write activity log to console')
+        del argv[0]
+        args = p.parse_args(argv)
+
+        # port
+        if args.port is None:
+            raise Exception("User must specify a port number")
+        port = int(args.port)
+
+        # logging
+        logger = Logger(title = "TCP_echo_server port %d" % port,
+                        print_to_console = args.log,
+                        save_for_dump = False)
+
+        main_except(port, logger)
+        return 0
+    except Exception as e:
+        traceback.print_exc()
+        return 1
+
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv))


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org