How to use eventcore write an echo server?

electricface electricface at qq.com
Tue Mar 26 03:19:02 UTC 2024


On Thursday, 14 March 2024 at 18:49:54 UTC, Dejan Lekic wrote:
> On Tuesday, 12 March 2024 at 05:13:26 UTC, zoujiaqing wrote:
>> How to fix it? than you ;)
>
> Try the following:
>
> ```
> class Connection
> {
> 	StreamSocketFD client;
>
> 	ubyte[1024] buf = void;
>
>         // Add these two lines before the constructor:
>         nothrow:
>         @safe:
>
> 	this(StreamSocketFD client)
> ```
>
> Also you will need to either comment out calls to writeln() or 
> surround them in try/catch as writeln() may throw so it can't 
> really be called in nothrow code... For starters just comment 
> all calls to writeln() out to make it compile, and then move 
> from there.

This is the code I modified that can be compiled and run 
successfully.

```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);
     }


     nothrow @safe: void onClientConnect(StreamListenSocketFD 
listener, StreamSocketFD client, scope RefAddress)
     {
     	import std.array: appender;
     	import std.algorithm: copy;

     	try {
     		writeln("onClientConnect");
     		Connection connection = new Connection(client);
     		auto w = appender!(ubyte[]);
     		string str = "Welcome to use my echo server.";
     		copy(str, w);
     		connection.write(w[]);
     	} catch (Exception e) {
     		// pass
     	}
     	
     }

     class Connection
     {
     	StreamSocketFD client;

     	ubyte[1024] buf = void;

     	nothrow:
     	@safe:

     	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)
     	{
     		try {
     			writeln("Send size: ", len);
     		} catch (Exception e) {
     			// pass
     		}
     	}

     	void onRead(StreamSocketFD, IOStatus status, size_t 
bytes_read)
     	{
     		if (status != IOStatus.ok)
     		{
     			try {
     				writeln("Client disconnect");
     			} catch (Exception e) {
     				// pass
     			}
     			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);
     	}
     }
     ```


More information about the Digitalmars-d-learn mailing list