1

Dに次のプリミティブサーバーがあります:

import std.stdio; 
import std.socket; 

int main() {

const int port = 8080; 

InternetAddress addr = new InternetAddress(InternetAddress.ADDR_ANY, port); 
TcpSocket server = new TcpSocket(AddressFamily.INET); 

server.bind(addr); 
server.listen(10);


for(;;) {

    Socket newclient = server.accept(); 

    newclient.send("HTTP/1.1 200 OK\r\n"); 
    newclient.send("Content-type: text/html\n\n"); 
    newclient.send("Hi from D!");

    newclient.shutdown(SocketShutdown.BOTH); 
    newclient.close(); 
}



    return 0;
}

ブラウザで接続しても「Hi From D!」が表示されず、そのまま切断されてしまいます。

私の仮定は、 send() がデータをバッファリングし、そのバッファをフラッシュする必要があるということです。しかし、私はあなたがそれを行う方法を理解していません。興味深いことに、writefln("asdf asdf\n"); を使用して STDOUT にデータを書き込むと、コードは機能します。send() の最後の呼び出しの後、したがって私の仮定。

それとも、間違った木を吠えていますか?

4

2 に答える 2

5

あなたのコードは実際に私のために働いた....しかし、とにかく役立つかもしれないいくつかの変更:

1) Content-length ヘッダーを応答に追加する

2) \n\n ではなく \r\n\r\n を使用してヘッダーを終了します。

それでも問題が解決しない場合は、ファイアウォールまたは同様のものが接続をブロックしている可能性もあります。

于 2012-12-11T20:24:51.120 に答える
5

これはむしろヘッダーの問題である可能性があります。次のようにしてみてください。

// -- cut --

Socket newclient = server.accept(); 

newclient.send("HTTP/1.1 200 OK\r\n"); 
newclient.send("Content-type: text/plain\r\n"); 
newclient.send("Connection: close\r\n\r\n");
newclient.send("Hi from D!\r\n");

newclient.shutdown(SocketShutdown.BOTH); 
newclient.close();

// -- cut --

更新: win64でスニペットを再確認しましたが、コンテンツ タイプに関する私の推測は正しいようです。コンテンツをtext/htmlとして宣言する場合は、有効な html を提供する必要があります。

<html><body>Hi from D!</body></html>

または、正しいコンテンツ タイプ (つまり、text/plain ) を指定します。

この種の動作は、Windows でのみ発生することに注意してください。つまり、Linux では、スニペットはそのまま (ff、telnet などで) 動作します。

于 2012-12-11T20:54:25.050 に答える