Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用套接字C发布请求#_C#_Sockets_Post - Fatal编程技术网

C# 使用套接字C发布请求#

C# 使用套接字C发布请求#,c#,sockets,post,C#,Sockets,Post,我想为一个网站做一个拍卖狙击手。要出价,您需要向/auction/place_bid发送4个参数(当然还有cookies)。我需要使用套接字,而不是HttpWebRequest。代码如下: string request1 = "POST /auction/place_bid HTTP/1.1\r\nHost: *host here*\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0

我想为一个网站做一个拍卖狙击手。要出价,您需要向/auction/place_bid发送4个参数(当然还有cookies)。我需要使用套接字,而不是HttpWebRequest。代码如下:

        string request1 = "POST /auction/place_bid HTTP/1.1\r\nHost: *host here*\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)\r\nAccept: /*\r\nContent-Type: application/x-www-form-urlencoded; charset=UTF-8\r\nX-Requested-With: XMLHttpRequest\r\n" + cookies +"\r\n";
        string request3 = "token=" + token + "&aid=" + aid + "&bidReq=" + ptzReq + "&recaptcha_challenge_field=" + rcf + "&recaptcha_response_field=" + rrf+"\r\n\r\n";
        string request2 = "Content-Length: " + (Encoding.UTF8.GetByteCount(request1+request3)+23).ToString() + "\r\n";
        byte[] dataSent = Encoding.UTF8.GetBytes(request1+request2+request3);
        byte[] dataReceived = new byte[10000];
        Socket socket = ConnectSocket(server, 80);
        if (socket == null)
        {
            return null;
        }
        socket.Send(dataSent, dataSent.Length, 0);
        int bytes = 0;
        string page = "";
        do
        {
            bytes = socket.Receive(dataReceived, dataReceived.Length, 0);
            page = page + Encoding.ASCII.GetString(dataReceived, 0, bytes);
        }
        while (bytes > 0);

        return page;
当我尝试接收网页时,当我添加

socket.Blocking = true;
我的应用程序停止响应,约1分钟后返回页面,但它是空的!当我尝试发出GET请求时,它工作得非常完美。我希望你能帮助我。顺便说一句,这是我第一次使用套接字,所以我的代码非常糟糕,对此表示抱歉


*我使用的是一个ConnectSocket类,在上给出了一个示例(链接指向俄语MSDN,很抱歉,我没有找到同一篇英文文章,但您会理解代码)

内容长度头应该指示内容的大小。您将其设置为标题和内容的总大小

Encoding.UTF8.GetByteCount(request1+request3)+23).ToString()
由于消息的内容部分只是
request3
,服务器耐心地等待
字节数(request1)+23
更多您从未发送的内容字节

请尝试以下方法:

"Content-Length: " + Encoding.UTF8.GetByteCount(request3).ToString() + "\r\n"

另一个问题类似于您的循环:

do
{
    bytes = socket.Receive(dataReceived, dataReceived.Length, 0);
    page = page + Encoding.ASCII.GetString(dataReceived, 0, bytes);
}
while (bytes > 0);
由于非阻塞套接字操作无论是否已完成,都会立即返回,因此需要一个循环,该循环将不断调用
Receive()
,直到操作实际完成。在这里,如果对
Receive()
的调用返回
0
(这几乎肯定是第一次),则退出循环


您至少应该将其更改为
while(bytes,正如人们已经指出的:
HttpWebRequest
不是性能问题的原因。切换到套接字实现不会影响任何事情

事实上,
HttpWebRequest
如果愿意,可以做无数愚蠢的事情,而且它仍然比从web服务器获取内容所需的时间要快

如果您对套接字和http协议有很好的了解,那么切换到套接字实现可能会加快速度。您显然没有这方面的知识,因此我建议您再次回到
HttpWebRequest

如果要从同一个Web服务器获取大量页面,可能需要使用
WebClient
,因为它将保持连接的活动状态

更新 我不需要太多的连接,我需要一次提出一个请求,而且应该尽可能快


那么,使用哪种实现其实并不重要。网络延迟总是比实际的HTTP客户端实现大得多。构建HTTP请求不需要太多资源,解析响应也不需要太多资源。

您是如何确定
HttpWebRequest
在这里速度慢的?用于发送一个基本的请求/响应应该没问题,只是受到intatubez的阻碍…我不确定使用套接字是否会让事情变得更快。毕竟,网络是缓慢的一部分,而不是本地机器上的处理。也许你和站点之间只是有很多网络延迟?你怎么会认为同步套接字通信会输出执行HttpWebRequest?有多少个请求会导致这一问题?我们推出了自己的HTTP堆栈,但这实际上是每秒发出数百个请求……除非你真的努力,否则HttpWebRequest应该会做得很好。这是一项非常重要的任务。你不会获得比HttpWebRe更好的性能通过剪切粘贴示例代码来完成任务,这显然不是为了提高卷性能而编写的。如果您真的想准备进行大量连接,请研究HttpWebRequest的异步方法(及其无数选项)然后,只有在严格必要且经过大量仔细测量后,才可以使用异步套接字方法。目前的代码永远不会比HttpWebRequest提供的更好。
HttpWebRequest
将比使用套接字手动滚动的任何程序都要快。相信我们。它一直这么说“无法立即完成对未阻止套接字的操作”。感谢您的回答!非阻止套接字就是这样工作的。对
Send()
Receive()的调用
立即返回,套接字在后台执行其操作。您需要等待服务器有时间响应。如果服务器尚未获得任何数据,您将收到“错误”,这意味着您只需重试。