在system.net.socket中将http标头发送到客户端的实际方法

时间:2015-04-11 17:23:41

标签: 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);

但这种方式似乎并不好。很少客户端无法获得响应,当我查看我的日志时,我发现他只收到了标题。

我尝试使用blockcopy连接两个字节数组,并一次发送标头和其他数据。但不幸的是,这不起作用。我不能这样向客户发送任何东西。我用这种方式使用blockcopy:

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);

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

由于

1 个答案:

答案 0 :(得分:1)

我怀疑您是通过BeginSend发送两次(一次是标题,一次是正文),第二次BeginSend发生在第一次BeginSend完成之前。如果您这样做:行为未定义(您违反了预期的用法)。预计一次只能有一个出站异步操作。如果您的代码不方便:不使用异步:只需使用Send。利用任何异步套接字API需要进行大量的规划并注意细节。