Creating a C# like Asynchronous Socket
DrCataclysm
4002600 at ba-glauchau.de
Sun Nov 5 14:47:37 UTC 2017
I am trying to build something like the asynchronous Sockets from
C# .NET but I'm stuck at the accepting phase.
My code is something like this:
public class TCPListener {
ushort _port;
string _address;
bool _active;
string _lineEnd;
ubyte[] _messageBuffer;
Socket _socket;
Socket _connection;
int _waitForAnswer = 500;
bool _keepOpen = true;
this(string address, ushort port, string lineEnd = "\n") {
_port = port;
_address = address;
_socket = new TcpSocket();
_socket.setOption(SocketOptionLevel.SOCKET,
SocketOption.REUSEADDR, true);
this.connect(&this.Accepted);
this.connect(&this.Received);
}
void startListening(){
try{
_socket.bind(new InternetAddress(_port));
_socket.listen(3);
}
catch (Exception e){
writeln(e.msg);
}
auto _connectionTask = task(&this.Accept);
_connectionTask.executeInNewThread();
}
private void Accept(){
bool error = false;
// try to accept connection
try{
Socket client = _socket.accept();
Thread.sleep( dur!("msecs")( 50 ) );
MessageBuffer buffer;
auto received = client.receive(buffer.data);
emit(error);
//_connection = client;
}
catch (SocketAcceptException e){
writeln("Error while accepting connection: " ~ e.msg);
error = true;
}public class TCPListener {
ushort _port;
string _address;
bool _active;
string _lineEnd;
ubyte[] _messageBuffer;
Socket _socket;
Socket _connection;
int _waitForAnswer = 500;
bool _keepOpen = true;
this(string address, ushort port, string lineEnd = "\n") {
_port = port;
_address = address;
_socket = new TcpSocket();
_socket.setOption(SocketOptionLevel.SOCKET,
SocketOption.REUSEADDR, true);
this.connect(&this.Accepted);
this.connect(&this.Received);
}
void startListening(){
try{
_socket.bind(new InternetAddress(_port));
_socket.listen(3);
}
catch (Exception e){
writeln(e.msg);
}
auto _connectionTask = task(&this.Accept);
_connectionTask.executeInNewThread();
}
private void Accept(){
bool error = false;
// try to accept connection
try{
Socket client = _socket.accept();
Thread.sleep( dur!("msecs")( 50 ) );
MessageBuffer buffer;
auto received = client.receive(buffer.data);
emit(error);
//_connection = client;
}
catch (SocketAcceptException e){
writeln("Error while accepting connection: " ~ e.msg);
error = true;
}
finally{
emit(error);
}
}
mixin Signal!(bool);
finally{
emit(error);
}
}
mixin Signal!(bool);
...
}
The client created by _socket.accept() cannot receive any data.
client.receive() immediately returns 0 like a non-blocking
socket. I think it has something to do with the original socket
being owned by a different thread.
I am not very familiar with multitasking/multithreading in D so
any help would be appreciated.
More information about the Digitalmars-d-learn
mailing list