none
System.Net.Sockets問題 RRS feed

  • 問題

  • 請問System.Net.Sockets世不是不能走http協定阿
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim serverIP As IPAddress = Dns.GetHostEntry("www.google.com.tw").AddressList(0)
            Dim Port As String = "80"
            Dim serverhost As New IPEndPoint(serverIP, Int32.Parse(Port))
            Dim clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            Try
                clientSocket.Connect(serverhost)
                If clientSocket.Connected = False Then
                    MsgBox("Connect Error.", MsgBoxStyle.Critical, "HTTP")
                    Exit Sub
                End If
                Dim httpReq As String = "GET / HTTP/1.0" & ControlChars.CrLf & ControlChars.CrLf
                clientSocket.Send(ASCII.GetBytes(httpReq))
                Dim buffer(1024) As Byte
                Dim byteCount As Int16 = clientSocket.Receive(buffer, buffer.Length, 0)
                TextBox1.Text = ASCII.GetString(buffer, 0, byteCount)
                Do While byteCount > 0
                    byteCount = clientSocket.Receive(buffer, buffer.Length, 0)
                    TextBox1.Text = TextBox1.Text & ASCII.GetString(buffer, 0, byteCount)
                Loop
            Catch ex As Exception
                MsgBox(ex.StackTrace.ToString(), MsgBoxStyle.Critical, "Exception")
            End Try
        End Sub

    這樣是可以的
    可是如果加上http://就會無法連線 'Dim serverIP As IPAddress = Dns.GetHostEntry("http://www.google.com.tw").AddressList(0)
    或是網頁有內頁像這樣http://images.google.com.tw/imghp?hl=zh-TW&tab=wi
    我把http://去掉也是錯誤
    難道只有HttpWebRequest才能通http://協定嗎
    如果可以,請問要如何解決呢?
    2009年5月27日 上午 11:27

解答

  • 您提到了 [無法去把網頁下載] , 所以您是想要下載網頁 ?
    您也可以試試 WebClient.DownloadData 方法 : 下載具有指定之 URI 的資源做為 Byte 陣列。
    http://msdn.microsoft.com/zh-tw/library/ms144188(VS.80).aspx

    一個小範例,將網頁原始碼儲存到 C:\test.txt 中

    Imports System.Net
    Imports System.Text
    Imports System.IO
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim wc = New WebClient()
            Dim sw = New StreamWriter("C:\\test.txt", False, Encoding.Default)
            Dim aryByte As Byte() = wc.DownloadData("http://images.google.com.tw/imghp?hl=zh-TW&tab=wi")
            sw.Write(Encoding.Default.GetString(aryByte))
            Process.Start("C:\\test.txt")
        End Sub
    End Class
    
    2009年5月27日 下午 01:27
    版主

所有回覆

  • 1. 您先參考 MSDN 中對 Dns.GetHostEntry 方法 的解釋
    http://msdn.microsoft.com/zh-tw/library/system.net.dns.gethostentry.aspx

    Dns.GetHostEntry(String) : 將主機名稱或 IP 位址解析至 IPHostEntry 執行個體。
    主機名稱指的是 www.google.com.tw , IP 的話是 66.249.89.99

    因此您傳入值不對,程式自然會出問題


    2. 您為何不使用 WebRequest
    http://blog.blueshop.com.tw/dplayerd/archive/2009/03/28/58338.aspx

    2009年5月27日 下午 12:04
    版主
  •     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'Dim serverIP As IPAddress = Dns.GetHostEntry("tw.yahoo.com").AddressList(0)
            Dim serverIP1 As IPHostEntry = Dns.GetHostEntry("http://www.google.com.tw")
            Dim Port As String = "80"
            Dim serverhost As New IPEndPoint(serverIP, Int32.Parse(Port))
            Dim clientSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            Try
                clientSocket.Connect(serverhost)
                If clientSocket.Connected = False Then
                    TextBox1.Text = "連接錯誤。"
                    Exit Sub
                End If
                Dim httpReq As String = "GET / HTTP/1.0" & ControlChars.CrLf & ControlChars.CrLf
                clientSocket.Send(Encoding.UTF8.GetBytes(httpReq))
                Dim buffer(2048) As Byte
                Dim byteCount As Int16 = clientSocket.Receive(buffer, buffer.Length, 0)
                TextBox1.Text = Encoding.UTF8.GetString(buffer, 0, byteCount)
                Do While byteCount > 0
                    byteCount = clientSocket.Receive(buffer, buffer.Length, 0)
                    TextBox1.Text = TextBox1.Text & Encoding.UTF8.GetString(buffer, 0, byteCount)
                Loop
            Catch ex As Exception
                TextBox1.Text = ex.StackTrace.ToString()
            End Try
        End Sub


    這樣好了 那Dim serverhost As New IPEndPoint那邊出現問題了
    是不是在前也要把domain name轉換成IP才可以呢
    接下來我該怎麼做??
    2009年5月27日 下午 12:59
  • Socket 是以主機名稱或IP位址為主,您想使用 Http 的方式可能沒辦法實現

    最主要的方法 Socket.Connect : 建立至遠端主機的連接,其傳入值也只能 EndPoint、IPAddress、String主機名稱。
    2009年5月27日 下午 01:18
    版主
  • 喔喔
    Socket不能獲取所有主機內的網頁源碼了喔
    還是要用HttpWebRequest了
    不過我覺得HttpWebRequest還比inet爛
    因為它無法去把網頁下載inet可以
    不過inet容易當
    所以才要是看看Socket
    埃~~又灰心了
    2009年5月27日 下午 01:21
  • 您提到了 [無法去把網頁下載] , 所以您是想要下載網頁 ?
    您也可以試試 WebClient.DownloadData 方法 : 下載具有指定之 URI 的資源做為 Byte 陣列。
    http://msdn.microsoft.com/zh-tw/library/ms144188(VS.80).aspx

    一個小範例,將網頁原始碼儲存到 C:\test.txt 中

    Imports System.Net
    Imports System.Text
    Imports System.IO
    Public Class Form1
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim wc = New WebClient()
            Dim sw = New StreamWriter("C:\\test.txt", False, Encoding.Default)
            Dim aryByte As Byte() = wc.DownloadData("http://images.google.com.tw/imghp?hl=zh-TW&tab=wi")
            sw.Write(Encoding.Default.GetString(aryByte))
            Process.Start("C:\\test.txt")
        End Sub
    End Class
    
    2009年5月27日 下午 01:27
    版主
  • 我正在找他的方法
    有沒有MSN可以跟你討論阿
    我的g69714@ms21.url.com.tw
    2009年5月27日 下午 01:29
  • 補充了一個小範例,您先試試看效果

    2009年5月27日 下午 01:36
    版主
  • ...
    1. http://xxx 這個叫坐 url 路徑,socket 只能用 domain name / ip / computer name ,不要亂塞字串。
    2. 自己用 socket 類別時,要考慮到,網路瞬間可能發生流量為 0 的等待狀況,你的 do while 邏輯上有問題。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月27日 下午 02:01
  • 我研究看看
    因為我用inet時他可以同時傳送上一個網頁的cookie
    HttpWebRequest是可以CookieContainer傳送
    不過我是要用來刷網頁的我這部分還不是很了解
    因為用過sniffer測試

    inet和HttpWebRequest
    要刷網頁的記數器時發現HttpWebRequest沒作用
    inet是有作用的
    不知道什麼原因
    而且我看我本機暫時存放cookie地方
    用inet有下載回來
    HttpWebRequest沒有
    有可能HttpWebRequest及時反射回去還是放到記憶體我也不知道
    但就是inet比它好用就是很容易當調
    那我就用WebClient來刷頁有沒有效果了

    2009年5月27日 下午 02:12
  • inet.ocx 應該是包裝 InternetExplorer Object ,跟 WebBrowser Control 都是相同的核心。

    HttpWebRequest / WebClient 是包 socket ,所以 cookies 要自己處理。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月27日 下午 03:42
  • 那我還是選inet好了
    加個錯誤顯示到textbox就不會出現錯誤彈窗
    HttpWebRequest送cookie有送出但是沒效果
    有可能是一定要有下載網頁才有效了

    2009年5月27日 下午 04:00
  • 不知道你的目標網站是啥,asp.net 網站為了防堵攻擊,必須先有 get ,會在 cookies 中寫入 aspnet sesion id ,所以這個東西沒有的話,基本上會被擋,當然不排除以 .Net sdk 方式撰寫的網站不會擋。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月27日 下午 04:36
  • http://www.phate.tw/thread-5687-1-1.html
    這邊有人發過
    那是我第一個目標
    第二個就是刷他人頭
    HttpWebRequest就沒辦法
    首先我要先登入才會留下足跡
    那麼用HttpWebRequest獲取登入也就是https獲取網頁會有一個轉向
    那邊我是先獲取網頁源碼在取javascript裡的網址
    每次登入那個轉向網址都不同
    所以我就每一個帳號都要做登入
    那轉向也就他的網制了
    可是用HttpWebRequest都沒有留下足跡
    只有inet有
    不過第個目標的話我有用cookie送出是可以計算到的
    就是人頭沒留下(第二目標)
    2009年5月27日 下午 04:56
  • ...
    這已經算是網頁攻擊程式了。

    本版版規有規範:禁止討論惡意程式
    張貼文章應注意事項及應提供資訊
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年5月27日 下午 05:16
  • 解貼

    2009年5月27日 下午 05:18