簡體   English   中英

使用套接字C#的POST請求

[英]POST request using sockets C#

我正在為網站做一個狙擊手。 要出價,您需要向/ auction / place_bid發送4個參數(當然還有cookie)。 我需要使用套接字,而不是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;

當我嘗試接收網頁時,當我添加時,Visual Studio說“無法立即完成對未阻塞套接字的操作”

socket.Blocking = true;

我的應用程序停止響應,並在大約1分鍾后返回頁面,但它為空! 當我嘗試發出GET請求時,它的效果很好。 我希望你能幫助我。 順便說一句,這是我第一次使用套接字,因此我的代碼非常糟糕,對此感到抱歉。

*我使用的是ConnectSocket類,該類在msdn中作為示例給出(該鏈接指向俄語MSDN,對不起,我沒有找到相同的英文文章,但無論如何您都會理解代碼)

Content-Length標頭應指示內容的大小。 您將其設置為標題內容的總大小。

Encoding.UTF8.GetByteCount(request1+request3)+23).ToString()

由於消息的內容部分僅是request3 ,因此服務器正在耐心等待ByteCount(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 <= 0) ,這將使您至少獲得一些數據(可能只是第一個數據包的價值左右)。 理想情況下,您應該繼續調用Receive()直到在答復中看到Content-Length標頭,然后繼續調用Receive()直到標頭結尾,然后再讀取Content-Length個字節。

由於您正在使用套接字,因此實際上您必須重新實現HTTP協議。

正如人們已經指出的那樣: HttpWebRequest不是導致您性能問題的原因。 切換到套接字實現不會有任何影響。

事實是, HttpWebRequest可以根據需要處理數十億個愚蠢的事情,並且它仍然比從Web服務器獲取內容所需的時間更快。

如果您對套接字和http協議有足夠的了解,那么切換到套接字實現可能會加快速度。 您顯然沒有,所以我建議您再次回到HttpWebRequest

如果您要從同一台Web服務器獲取許多頁面,則可能要使用WebClient ,因為它將使連接保持活動狀態。

更新資料

我不需要太多的連接,我需要一次發出1個請求,並且它應該盡可能快

好。 然后,使用哪種實現並不重要。 網絡延遲將總是比實際的HTTP客戶端實現大很多。 建立一個HTTP請求不會占用太多資源,解析響應也不會這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM