D on Linux でSocketを使う時の注意

何やらInternetAddressクラスの初期化部分で抜けてる所があるらしい。

import std.stdio;
import std.stream;
import std.socket;
import std.socketstream;

int main( string[] args ) {

  auto l_SS = new SocketStream( new TcpSocket( new InternetAddress("twitter.com", 80) ) );
  l_SS.writeString( "hoge" ); // WriteException:unable to write to stream
  ...
  return 0;
}

こんな例外を吐く。


↓解決方法

import std.stdio;
import std.stream;
import std.socket;
import std.socketstream;

class MyInternetAddress: InternetAddress
{
        this(string addr, ushort port)
        {
                sin.sin_family = AddressFamily.INET;
                super(addr, port);
        }

        this(uint addr, ushort port)
        {
                sin.sin_family = AddressFamily.INET;
                super(addr, port);
        }

        this(ushort port)
        {
                sin.sin_family = AddressFamily.INET;
                super(port);
        }
}

int main( string[] args ) {

  auto l_SS = new SocketStream( new TcpSocket( new MyInternetAddress("twitter.com", 80) ) );
  l_SS.writeString( "hoge" ); // OK!
  ...
  return 0;
}

InternetAddressクラスを継承したMyクラスを作り、
その初期化部分で sin.sin_family = AddressFamily.INET; を入れてやれば良い。


詳細はこちら。
http://d.puremagic.com/issues/show_bug.cgi?id=2835