【问题标题】:D - send data to socketD - 向套接字发送数据
【发布时间】:2012-11-29 10:55:40
【问题描述】:

我在 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() 之后,因此我的假设。

还是我找错树了?

【问题讨论】:

  • 在处理 HTTP 时使用\r\n,因为如果我没记错的话,这就是协议所要求的。无论如何,我想知道的是 - 你 100% 确定这不是 Windows 防火墙问题吗? barti_ddu 的代码也应该可以在 Windows 上运行,唯一没有意义的原因是 Windows 防火墙不允许您连接...

标签: sockets d send


【解决方案1】:

您的代码实际上对我有用....但是一些更改可能会有所帮助:

1) 在响应中添加 Content-length 标头

2) 使用 \r\n\r\n 结束标题而不是 \n\n。

如果这些都没有帮助,也可能是防火墙或类似问题阻止了您的连接。

【讨论】:

  • 是的。虽然标头的第一行意味着它声称是 HTTP 1.1,但它绝对不是有效的 HTTP 1.1,如果接收者足够松懈,它可能会起作用。
  • 谢谢,我已经更改了标题,但它仍然不适合我。我在 Windows 上进行测试。例如,如果我将此代码“移植”到 perl,它就可以正常工作。嗯。
  • 我现在没有可用的 Windows 机器所以还在猜测,但我接下来要做的是编写一个简单的客户端程序,将网络输出连接并转储到屏幕上。然后什么都没有出来,回头看看缓冲区,如果你得到了什么,回到协议(也许另一个问题是你没有收到数据,所以浏览器将响应视为它从未要求过的东西。)缓冲区是可能的,但我对此表示怀疑,因为关闭套接字应该刷新任何未决的输出。
【解决方案2】:

这可能是一个标题问题,尝试类似:

// -- 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下的sn-p和我对content-type的猜测> 似乎是对的。如果您将内容声明为 text/html,您应该提供有效的 html,即

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

或提供正确的网络类型(即 text/plain)。

请注意,我只在带有 ie 的 windows 上得到这种行为,在 linux 上,你的 sn-p 按原样工作(使用 ff、telnet 等)。

【讨论】:

    猜你喜欢
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多