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; を入れてやれば良い。