crypt of decay - простейший многопоточный TCP-сервер (echo) на D [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

простейший многопоточный TCP-сервер (echo) на D [Apr. 11th, 2014|09:15 pm]
Previous Entry Add to Memories Tell A Friend Next Entry

module server;

import core.time;
import std.concurrency;
import std.socket;
import std.stdio;
import std.traits;
import std.typecons;


auto share(alias var) () if (is(typeof(var) == class)) {
  return cast(shared)var;
}


auto unshare(alias var) () if (is(typeof(var) == class)) {
  return cast(Unqual!(typeof(var)))var;
}


private void receiver_thread (shared Socket sks) {
  auto ssr = scoped!SocketSet();
  auto sk = unshare!sks();
  scope(exit) {
    writeln("closing socket...");
    sk.shutdown(SocketShutdown.BOTH);
    sk.close();
  }
  ubyte[1] buffer;
  writeln("receiver thread started");
  while (sk.isAlive) {
    ssr.reset();
    ssr.add(sk);
    int res = Socket.select(ssr, null, null, dur!"seconds"(3));
    if (res == 0) {
      writeln("socket timeout!");
      break;
    }
    if (res < 0) {
      writeln("select error!");
      break;
    }
    ptrdiff_t rv = sk.receive(buffer);
    if (rv == 0 || rv == Socket.ERROR) {
      if (rv == Socket.ERROR) writeln("receiving error");
      break;
    }
    writeln("received ", rv, " bytes: ", buffer[0]);
  }
  writeln("client closed connection");
}


void main () {
  TcpSocket listener = new TcpSocket(AddressFamily.INET);
  listener.setOption(SocketOptionLevel.SOCKET, SocketOption.REUSEADDR, 1);
  listener.bind(new InternetAddress("localhost", 8080));
  listener.blocking(true);
  listener.listen(0);
  for (;;) {
    try {
      Socket sk = listener.accept();
      spawn(&receiver_thread, share!sk());
    } catch (SocketAcceptException e) {
      writeln("socket accept error: ", e.msg);
    }
  }
  listener.shutdown(SocketShutdown.BOTH);
  listener.close();
}
Linkmeow!

Comments:
From:(Anonymous)
Date:April 11th, 2014 - 09:00 pm
(Link)
не оче
From:(Anonymous)
Date:April 11th, 2014 - 09:03 pm
(Link)
Мне нравится правильный индентейшен и правильно расставленные скобки(открывающая не на новой строчке).

Всегда так делаю и по таким маленьким деталям знаю людей которые большие проекты пишут.
From:(Anonymous)
Date:April 11th, 2014 - 09:03 pm
(Link)
Знаю как в "узнаю в толпе кодеров".
From:(Anonymous)
Date:April 11th, 2014 - 09:06 pm
(Link)
>открывающая не на новой строчке

Пошло. Только стиль gnu, только хардкор.
[User Picture]
From:[info]ketmar
Date:April 11th, 2014 - 09:18 pm
(Link)
на самом деле скобки на отдельной строке лучше — удобней сворачивать. а на той же строке — это привычка терминалов с минимальным количеством строк. но я уже очень старый, чтобы переучиваться.
From:(Anonymous)
Date:April 11th, 2014 - 09:25 pm
(Link)
> сворачивать

Разочаровал. Никогда так не делаю. Код нужно писать и разбивать так, чтобы не хотелось его сразу же сворачивать.
[User Picture]
From:[info]ketmar
Date:April 11th, 2014 - 09:29 pm
(Link)
я использую mcedit, у него вообще нет варианта «свернуть». я про тех, кому сворачивать нравится.
From:(Anonymous)
Date:April 11th, 2014 - 09:30 pm
(Link)
Никогда не понимал таких людей. Почему они это делают?
[User Picture]
From:[info]ketmar
Date:April 11th, 2014 - 09:37 pm
(Link)
делают что?
From:(Anonymous)
Date:April 11th, 2014 - 09:40 pm
(Link)
Скрывают код. Так нельзя.
[User Picture]
From:[info]ketmar
Date:April 11th, 2014 - 09:58 pm
(Link)
говорят, что удобно.
From:(Anonymous)
Date:April 11th, 2014 - 09:05 pm
(Link)
хуевый пример
по сути библиотеки сравниваешь
From:(Anonymous)
Date:April 11th, 2014 - 09:12 pm
(Link)
плюс алтын
From:(Anonymous)
Date:April 11th, 2014 - 09:13 pm
(Link)
+++

Лови плюсик в кармочку.
[User Picture]
From:[info]ketmar
Date:April 11th, 2014 - 09:17 pm
(Link)
я вообще ничего не сравниваю, просто кинул пример. не к тому, чтобы показать, что D лучше.
From:(Anonymous)
Date:April 11th, 2014 - 09:47 pm
(Link)
да я и не упрекал
From:(Anonymous)
Date:April 11th, 2014 - 09:51 pm
(Link)
Может зря?
From:(Anonymous)
Date:April 11th, 2014 - 09:55 pm
(Link)
зачем?
[User Picture]
From:[info]ketmar
Date:April 11th, 2014 - 09:57 pm
(Link)
так я просто пояснял, что не для superior.
From:[info]silver-inv.livejournal.com
Date:April 11th, 2014 - 10:12 pm
(Link)
а я просто от скуки
[User Picture]
From:[info]ketmar
Date:April 11th, 2014 - 10:21 pm
(Link)
а ты посмотри на D — он охуенен.
From:[info]silver-inv.livejournal.com
Date:April 11th, 2014 - 10:27 pm
(Link)
смотрел и смотрю
но пока, увы, не реально применять

-чтонить кроме gcc это умеет?
-где брать людей?
-нахуя?
From:(Anonymous)
Date:April 11th, 2014 - 11:00 pm

(Link)
а у мя в рсс без подкатэ....