c# - 在system.net.socket中将HTTP header 发送到客户端的实际方法

标签 c# sockets

我使用system.net.socket监听端口。客户端通过XDomainRequest(IE9)发送请求,套接字处理其请求并将响应发送回去。

现在,我通过两个步骤发送响应。首先,我发送这样的标题:

string httpHeaders = "HTTP/1.1" + "\r\n";
httpHeaders += "Cache-Control: no-cache" + "\r\n";
httpHeaders += "Access-Control-Allow-Origin: *";
httpHeaders += "\r\n\r\n";

byte[] byteHttpHeaders = System.Text.Encoding.UTF8.GetBytes(httpHeaders);

handler.BeginSend(byteHttpHeaders, 0, byteHttpHeaders.Length, 0, new AsyncCallback(SendCallback), handler);

然后我发送数据的另一部分,像这样:
byte[] byteData= System.Text.Encoding.UTF8.GetBytes("Hello");

handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler);

但是这种方式似乎并不好。很少有客户无法获得响应,当我查看日志时,我看到他仅收到 header 。

我试图用blockcopy连接两个字节数组,并一次发送 header 和其他数据。但是不幸的是,这是行不通的。我无法通过这种方式将任何内容发送给客户端。我以这种方式使用块复制:
byte[] concat = new byte[byteHttpHeaders.Length + byteData.Length];

System.Buffer.BlockCopy(byteHttpHeaders, 0, concat, 0, byteHttpHeaders.Length);

System.Buffer.BlockCopy(byteData, 0, concat, byteHttpHeaders.Length, byteData.Length);

handler.BeginSend(concat, 0, concat.Length, 0, new AsyncCallback(SendCallback), handler);

我可以一次发送所有数据吗?最好的方法是什么?

谢谢

最佳答案

我怀疑您是通过BeginSend发送两次(一次头,一次是正文),而第二次BeginSend发生在第一个BeginSend完成之前。如果您这样做:行为是不确定的(您违反了预期的用法)。预计您一次只能进行一个出站异步操作。如果您的代码不允许这样做:不要使用async:只需使用Send即可。使用任何异步套接字API都需要大量的计划和对细节的关注。

关于c# - 在system.net.socket中将HTTP header 发送到客户端的实际方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29580788/

相关文章:

c# - 为什么使用 RoleEntryPoint 时无法访问 Application_Start 中的 RoleEnvironment?

c# - 在 C# 中追加到文本文件中

linux - 有多少方法可以在客户端尽快减少TIME_WAIT的数量

Java 套接字 writeObject 卡住

c# - 从 Umbraco API Controller 返回默认的 json

c# - IIS 中的 WCF,在工作组模式下使用 MSMQ

c# - Selenium WebDriver 跨测试用例共享同一 session

c++ - 关于so​​cket编程中如何发送图片的问题?

c++ - 套接字程序 Python vs C++ (Winsock)

python - SocketServer 在 Linux 上不工作