我使用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);
我可以一次发送所有数据吗?最好的方法是什么?
由于
答案 0 :(得分:1)
我怀疑您是通过BeginSend
发送两次(一次是标题,一次是正文),第二次BeginSend
发生在第一次BeginSend
完成之前。如果您这样做:行为未定义(您违反了预期的用法)。预计一次只能有一个出站异步操作。如果您的代码不方便:不使用异步:只需使用Send
。利用任何异步套接字API需要进行大量的规划并注意细节。