How to use eventcore write an echo server?

zoujiaqing zoujiaqing at gmail.com
Tue Mar 12 05:13:26 UTC 2024


I use eventcore latest version write an echo server for test.

some error of build.

my D code:

```D

import eventcore.core;
import std.functional : toDelegate;
import std.socket : InternetAddress;
import std.exception : enforce;
import core.time : Duration;
import std.stdio : writeln;

void main()
{
	auto addr = new InternetAddress("127.0.0.1", 1111);
	auto listener = eventDriver.sockets.listenStream(addr, 
toDelegate(&onClientConnect));
	enforce(listener != StreamListenSocketFD.invalid, "Failed to 
listen for connections.");

	writeln("Listening for requests on port 1111...");
	while (eventDriver.core.waiterCount)
		eventDriver.core.processEvents(Duration.max);
}

void onClientConnect(StreamListenSocketFD listener, 
StreamSocketFD client, scope RefAddress)
{
	Connection connection = new Connection(client);

	// Send welcome message to client
	connection.write("Welcome to use my echo server.");
}

class Connection
{
	StreamSocketFD client;

	ubyte[1024] buf = void;

	this(StreamSocketFD client)
	{
		this.client = client;

		eventDriver.sockets.read(client, buf, IOMode.once, &onRead);
	}

	void write(ubyte[] data)
	{
		eventDriver.sockets.write(client, data, IOMode.all, 
&onWriteFinished);
	}

	void onWriteFinished(StreamSocketFD fd, IOStatus status, size_t 
len)
	{
		writeln("Send size: ", len);
	}

	void onRead(StreamSocketFD, IOStatus status, size_t bytes_read)
	{
		if (status != IOStatus.ok) {
			writeln("Client disconnect");
			eventDriver.sockets.shutdown(client, true, true);
			eventDriver.sockets.releaseRef(client);
			return;
		}

		this.write(buf[0..bytes_read]);
		
		eventDriver.sockets.read(client, buf, IOMode.once, &onRead);
	}
}
```

error code:
```log
dub build
     Starting Performing "debug" build using ldc2 for aarch64, 
arm_hardfloat.
   Up-to-date taggedalgebraic 0.11.22: target for configuration 
[library] is up to date.
   Up-to-date eventcore 0.9.28: target for configuration 
[cfrunloop] is up to date.
     Building eventcoredemo ~master: building configuration 
[application]
source/main.d(12,50): Error: none of the overloads of 
`listenStream` are callable using argument types 
`(InternetAddress, void delegate(StreamListenSocketFD a0, 
StreamSocketFD a1, scope RefAddress a2) @system)`
../../../.dub/packages/eventcore/0.9.28/eventcore/source/eventcore/driver.d(213,23):        Candidates are: `eventcore.driver.EventDriverSockets.listenStream(scope Address bind_address, StreamListenOptions options, void delegate(StreamListenSocketFD, StreamSocketFD, scope RefAddress remote_address) nothrow @safe on_accept)`
../../../.dub/packages/eventcore/0.9.28/eventcore/source/eventcore/driver.d(215,29):                        `eventcore.driver.EventDriverSockets.listenStream(scope Address bind_address, void delegate(StreamListenSocketFD, StreamSocketFD, scope RefAddress remote_address) nothrow @safe on_accept)`
../../../.dub/packages/eventcore/0.9.28/eventcore/source/eventcore/drivers/posix/sockets.d(233,38):                        `eventcore.drivers.posix.sockets.PosixEventDriverSockets!(CFRunLoopEventLoop).PosixEventDriverSockets.listenStream(scope Address address, StreamListenOptions options, void delegate(StreamListenSocketFD, StreamSocketFD, scope RefAddress remote_address) nothrow @safe on_accept)`
source/main.d(25,18): Error: function 
`main.Connection.write(ubyte[] data)` is not callable using 
argument types `(string)`
source/main.d(25,18):        cannot pass argument `"Welcome to 
use my echo server."` of type `string` to parameter `ubyte[] data`
source/main.d(38,27): Error: function 
`eventcore.drivers.posix.sockets.PosixEventDriverSockets!(CFRunLoopEventLoop).PosixEventDriverSockets.read(StreamSocketFD socket, ubyte[] buffer, IOMode mode, void delegate(StreamSocketFD, IOStatus, ulong) nothrow @safe on_read_finish)` is not callable using argument types `(StreamSocketFD, ubyte[1024], IOMode, void delegate(StreamSocketFD, IOStatus status, ulong bytes_read))`
source/main.d(38,27):        cannot pass argument `&this.onRead` 
of type `void delegate(StreamSocketFD, IOStatus status, ulong 
bytes_read)` to parameter `void delegate(StreamSocketFD, 
IOStatus, ulong) nothrow @safe on_read_finish`
source/main.d(43,28): Error: function 
`eventcore.drivers.posix.sockets.PosixEventDriverSockets!(CFRunLoopEventLoop).PosixEventDriverSockets.write(StreamSocketFD socket, const(ubyte)[] buffer, IOMode mode, void delegate(StreamSocketFD, IOStatus, ulong) nothrow @safe on_write_finish)` is not callable using argument types `(StreamSocketFD, ubyte[], IOMode, void delegate(StreamSocketFD fd, IOStatus status, ulong len))`
source/main.d(43,28):        cannot pass argument 
`&this.onWriteFinished` of type `void delegate(StreamSocketFD fd, 
IOStatus status, ulong len)` to parameter `void 
delegate(StreamSocketFD, IOStatus, ulong) nothrow @safe 
on_write_finish`
source/main.d(62,27): Error: function 
`eventcore.drivers.posix.sockets.PosixEventDriverSockets!(CFRunLoopEventLoop).PosixEventDriverSockets.read(StreamSocketFD socket, ubyte[] buffer, IOMode mode, void delegate(StreamSocketFD, IOStatus, ulong) nothrow @safe on_read_finish)` is not callable using argument types `(StreamSocketFD, ubyte[1024], IOMode, void delegate(StreamSocketFD __param_0, IOStatus status, ulong bytes_read))`
source/main.d(62,27):        cannot pass argument `&this.onRead` 
of type `void delegate(StreamSocketFD __param_0, IOStatus status, 
ulong bytes_read)` to parameter `void delegate(StreamSocketFD, 
IOStatus, ulong) nothrow @safe on_read_finish`
Error ldc2 failed with exit code 1.
```

How to fix it? than you ;)


More information about the Digitalmars-d-learn mailing list