How do you connect Python with D via socket, I'm still getting connection refused error

Enjoys Math enjoysmath at gmail.com
Thu May 3 23:58:24 UTC 2018


Error
-----

builtins.ConnectionRefusedError: [WinError 10061] No connection 
could be made because the target machine actively refused it

Python Side
-----------
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
import socket
import settings


if __name__ == "__main__":
     app = QApplication([])

     window = QMainWindow()
     window.show()

     host = socket.gethostname()
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     sock.bind((host, 0))            # have os choose random 
available port
     print(host)
     sock.connect((host, settings.debugPort))

     try:

         # Send data
         message = 'This is the message.  It will be repeated.'
         print(sys.stderr, 'sending "%s"' % message)
         sock.sendall(message.encode())

         # Look for the response
         amount_received = 0
         amount_expected = len(message)

         while amount_received < amount_expected:
             data = sock.recv(16)
             amount_received += len(data)
             print(sys.stderr, 'received "%s"' % data)

     finally:
         print(sys.stderr, 'closing socket')
         sock.close()


     sys.exit(app.exec_())



And the D Side
--------------

module server;

import core.thread;
import std.socket;
import std.experimental.logger;

class Server : Thread
{
private:
	Socket listener;
	int backlog;
	string address;
	ushort port;
	SocketSet sockSet;
	Socket[] clients;
	bool running;

public:
	this(ushort port, string address="") {
		super(& run);
		
		if (address == "")
			address = "127.0.0.1";

		this.port = port;
		this.address = address;
		backlog = int.max;
		listener = null;
		running = false;
	}

	bool setupSocket() {
		try {
			listener = new Socket(AddressFamily.INET, SocketType.STREAM);
          auto address_list = getAddress(address, port);
          if (address_list.length) {
			   listener.bind(address_list[0]);
			   sockSet = new SocketSet();
          }
		}
		catch (Exception e) {
			log(LogLevel.critical, e.toString());
			return false;
		}
		return true;
	}

	void start() {
		if (listener is null)
		{
			if (! setupSocket())
				return;
		}
		running = true;
		if (! isRunning) super.start();
	}

	void stop() {
		running = false;
	}

private:
	void run() {
		char[1024] buffer;

		while(running) {
			sockSet.reset();
			sockSet.add(listener);
			foreach (client; clients)
				sockSet.add(client);
				if (Socket.select(sockSet, null, null)) {
					foreach (client; clients)
					{
						if (sockSet.isSet(client)) {
							auto got = client.receive(buffer);
							client.send(buffer[0 .. got]);
						}
					}
					if (sockSet.isSet(listener)) {
						auto newSocket = listener.accept();
						newSocket.send("Hello!\n");
						clients ~= newSocket;
					}

				}
		}
	}
}



More information about the Digitalmars-d-learn mailing list