none
各位在Windows 7的環境下,TCPIP及FTP有遇過相同的問題嗎? RRS feed

  • 問題

  • 各位同好 :

    前年(2009)在工作的需求下經過論壇的各位同好的指導完成了一個小小的AP

    當的時開發環境 :

    1:OS:Windows XP

    2:VB: VB 2008 Visual Studio

    實作內容 :

     a: TCPIP Client端

     b : FTP ,引用winnet.dll中 FTP的API 來進行

    程式發布後可以很正常的運作 , 但今年公司開始換成Windows 7之後狀況連連

    1 . 已確認每個人的OS均是以管理者身份登入安裝了這支AP , 防火牆全關 ,亦給這支AP所有權限

    2 . TCPIP的實作中,程式裡有卡一個IP Address的確認(利用 NetworkInterface.GetAllNetworkInterfaces() 來取得所有可用的IP)

         但Win7會認為網路連線能力不足 ,故AP會抓不到Host的IP-->

         後來AP改用Ping的方法, 已可Ping到HOST , 故直接修正AP只要Pink到HOST就進行連線 --> 暫時已解 (尚待討論_

    3 . FTP就一直搞不定 ,因為FTP中

     hOpen = InternetOpen("FTPFileList", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0)
                If (hOpen <> 0) Then

              'Internet Secsion Handle取得(FTP Server連接) - hConnection
                    hConnection = InternetConnect(hOpen, ftpIP, INTERNET_DEFAULT_FTP_PORT, "", "", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)
                    If (hConnection <> 0) Then 'Directory變更成功
                        '變更FTP Servver目前目錄
                        Dim lpszDir As String             'Buffer目錄
                        Dim lpdwDir As Long               'lpszDir之文字長度限制
                        lpdwDir = 256                     '文字長度限制為256字以下
                        lpszDir = Strings.Format(lpdwDir, Chr(0))  '確認Buffer目錄之長度
                      
                        result = FtpGetCurrentDirectory(hConnection, lpszDir, lpdwDir)  '取得目前目錄
                        result = FtpSetCurrentDirectory(hConnection, lpszDir)     '設定目使用的目錄

                        If result Then 'Directory變更成功

                            '檔案List取得
                            hFind = CInt(FtpFindFirstFile(hConnection, "*.*", w32FindData, INTERNET_FLAG_NEED_FILE, 0))

    ==========已找到路徑 "A:/" ==== 卻讀不到任何檔案
                            If (hFind <> 0) Then ................................

     

    Ps : 在Win7下安裝Visual Mode模擬WinXp , AP均可正常執行

    這個問題我查了好久 ,請大家協助提供意見 , 謝謝

     

     

     

    2011年12月23日 上午 07:33

解答

  • 各位先進 :

    這一個討論串,先前已被璉大標示為解答(2011/12/31)

    今日已被我取消了標示為解答 , 有失禮之處敬請見諒

    這一個討論問題 ,在上週之前我的解決(應該不算解決)方式是在Win7下使用xp Mode來執行AP

    以解決FTP 的上傳與下載問題 , 但xp Mode下需要開放更多的記憶體來供系統及AP使用,

    故使用上總被同仁反應諸多不便.........

    =====言歸正傳======

    這兩天我取得了FTP Service 的Source Code(C語言)及Debugger進行測試及Debug --> FTP Server沒有問題

    發現在我調用的API中InternetConnect , 在完成連線後 ,雖然Server回應是完成連線 ,但Server終端的資料卻顯示異常 ,所以Server的Status會變成Closing的情況

    為何會這樣,說實在的以我的現在的能力沒有辦法確認 , 故我初步判斷是我VB Code中調用API的參數應該有問題 (但同樣的AP在XP下執行是正常的 ,在Win7下就會失敗???)

    Google了一下 ,也有部份程式編輯者有相同的這一個問題

    =============

    所以我原本一直認為沒有問題的地方-->InternetConnect開始進行調整

    結論 :

    我的部份定義

    Public Const INTERNET_FLAG_PASSIVE As Integer = &H8000000

    Public Const INTERNET_FLAG_RELOAD As Integer = &H80000000

    原Code :

    hConnection = InternetConnect(hOpen, ftpIP, INTERNET_DEFAULT_FTP_PORT, "", "", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)

    修改後

    hConnection = InternetConnect(hOpen, ftpIP, INTERNET_DEFAULT_FTP_PORT, "", "", INTERNET_SERVICE_FTP, INTERNET_FLAG_RELOAD, 0)

    無論是FtpFindFirstFile/ FtpPutFile以及FtpGetFile 在Win7(64bit) 下全部都正常了 .........

    後記 :

    原本一直圍繞於執行者權限問題上處理,亦一直沒有結果(我想Win7下的AP權限是一定要設定的) ,

    一直迷失於處理FtpFindFirstFile/ FtpPutFile以及FtpGetFile 這幾段API的Code

    原來問題是發生於在處理這些檔案的程序前 ,連線上就有問題了(InternetConnect...) 但在VB的Debug中 ,連線是顯示成功的....

    這一支API的調用是參考網路上以及書本的結合體 , 所以也有可能是我在整合Const的定義上本來就不對以及不理解(盲目的抄...)

    個人也沒有進一步去了解各個Const的定義以及API的運用內容(造成XP與WIN7使用之結果不同)  , 所以自己給自己留下了一顆炸彈

    希望這一個論討的結果也能給網友們在使用XP轉到Win7環境者有所幫助  .

    最後感謝心冷,Bill以及各位網友的協助

    • 已標示為解答 Angusruby 2012年5月23日 上午 06:10
    2012年5月23日 上午 06:10

所有回覆

  • 用以下方式執行你的程式看看

    (1) 找到你的exe檔, 按滑鼠右鍵

    (2) 點選 "以系統管理員身份執行"

    如果這樣會正常, 那就是UAC的原因


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年12月23日 上午 08:57
    版主
  • Bill 您好:

    試完的結果會再回覆 ,謝謝您

    2011年12月26日 上午 02:26
  • 用以下方式執行你的程式看看

    (1) 找到你的exe檔, 按滑鼠右鍵

    (2) 點選 "以系統管理員身份執行"

    如果這樣會正常, 那就是UAC的原因


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    Bill 您好 :

    目前Server進行年保中 ,尚無法進行您提的測試

    假設是UAC的問題 ,那麼可修正的方式是否如下呢

    <requestedExecutionLevel level="asInvoker" uiAccess="false"

    修改成

    <requestedExecutionLevel  level="requireAdministrator" uiAccess="true"

     

    2011年12月26日 上午 06:45
  • To Angusruby:

      修改 Manifest 是一種方法, 這種方法的問題在於你每次執行就會出現UAC警告視窗.

      另一種解決的方式是直接對你要存取的目錄修改為適當的存取權限.

     


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2011年12月26日 上午 07:44
    版主
  • 你在 WinXP 年代有升級過 IE 嗎?跟這篇說的有沒有關係?

    IE7 不能與呼叫 wininet.dll 自定程式共用 Ftp 連線方式


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年12月26日 下午 12:39
  • 你在 WinXP 年代有升級過 IE 嗎?跟這篇說的有沒有關係?

    IE7 不能與呼叫 wininet.dll 自定程式共用 Ftp 連線方式


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。


    心冷大:

    謝謝你的回應 , 之前剛接觸VB時受你指導許多 , 開發的小程式也一一在公司被使用 , 真的很感謝你

    回到主題 :

    璉大的文章中所提到的與這篇是否有關聯,我會再去驗證

    其中璉大提到的,要強制指定 INTERNET_FLAG_PASSIVE ,在我的程式中亦是如此, 但還是無法在

    FtpFindFirstFile中找到檔案 , 璉大文章中提到可以使用萬用字元

    那麼方法是如何使用呢 ,

    就如我開版的程式碼中, 一樣在FtpFindFirstFile後取不到任何檔案

    心大可以提供一些作法及意見嗎

    另外,回覆一下Bill大 ,  將程式(exe)權限開放後一樣FtpFindFirstFile 找不到檔案

    目前都是先使用Visual Mode中的XP來執行AP , 但又得切不少的記憶體給XP Mode ......

     

    2011年12月27日 上午 01:02
  • 他的東西看起來原始碼在這,沒看到 VBNET 的:

    modWininet VB 函式庫 網際網路工具模組

    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    • 已標示為解答 璉璉Moderator 2011年12月31日 上午 09:25
    • 已取消標示為解答 Angusruby 2012年5月23日 上午 05:09
    2011年12月27日 下午 01:19
  • 各位先進 :

    這一個討論串,先前已被璉大標示為解答(2011/12/31)

    今日已被我取消了標示為解答 , 有失禮之處敬請見諒

    這一個討論問題 ,在上週之前我的解決(應該不算解決)方式是在Win7下使用xp Mode來執行AP

    以解決FTP 的上傳與下載問題 , 但xp Mode下需要開放更多的記憶體來供系統及AP使用,

    故使用上總被同仁反應諸多不便.........

    =====言歸正傳======

    這兩天我取得了FTP Service 的Source Code(C語言)及Debugger進行測試及Debug --> FTP Server沒有問題

    發現在我調用的API中InternetConnect , 在完成連線後 ,雖然Server回應是完成連線 ,但Server終端的資料卻顯示異常 ,所以Server的Status會變成Closing的情況

    為何會這樣,說實在的以我的現在的能力沒有辦法確認 , 故我初步判斷是我VB Code中調用API的參數應該有問題 (但同樣的AP在XP下執行是正常的 ,在Win7下就會失敗???)

    Google了一下 ,也有部份程式編輯者有相同的這一個問題

    =============

    所以我原本一直認為沒有問題的地方-->InternetConnect開始進行調整

    結論 :

    我的部份定義

    Public Const INTERNET_FLAG_PASSIVE As Integer = &H8000000

    Public Const INTERNET_FLAG_RELOAD As Integer = &H80000000

    原Code :

    hConnection = InternetConnect(hOpen, ftpIP, INTERNET_DEFAULT_FTP_PORT, "", "", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0)

    修改後

    hConnection = InternetConnect(hOpen, ftpIP, INTERNET_DEFAULT_FTP_PORT, "", "", INTERNET_SERVICE_FTP, INTERNET_FLAG_RELOAD, 0)

    無論是FtpFindFirstFile/ FtpPutFile以及FtpGetFile 在Win7(64bit) 下全部都正常了 .........

    後記 :

    原本一直圍繞於執行者權限問題上處理,亦一直沒有結果(我想Win7下的AP權限是一定要設定的) ,

    一直迷失於處理FtpFindFirstFile/ FtpPutFile以及FtpGetFile 這幾段API的Code

    原來問題是發生於在處理這些檔案的程序前 ,連線上就有問題了(InternetConnect...) 但在VB的Debug中 ,連線是顯示成功的....

    這一支API的調用是參考網路上以及書本的結合體 , 所以也有可能是我在整合Const的定義上本來就不對以及不理解(盲目的抄...)

    個人也沒有進一步去了解各個Const的定義以及API的運用內容(造成XP與WIN7使用之結果不同)  , 所以自己給自己留下了一顆炸彈

    希望這一個論討的結果也能給網友們在使用XP轉到Win7環境者有所幫助  .

    最後感謝心冷,Bill以及各位網友的協助

    • 已標示為解答 Angusruby 2012年5月23日 上午 06:10
    2012年5月23日 上午 06:10
  • INTERNET_FLAG_PASSIVE  : 使用Passive 模式建立連線

    FTP 的主動模式( active )和被動模式( passive )


    以下為簽名檔,如果你愛拉椅子坐那就是你的問題。
    先查MSDN文件庫
    再用GOOGLE搜尋
    才到論壇來發問

    這是論壇不是技術支援中心
    沒有人得無償解答你的問題

    在標題或文章註明很急
    不會增加網友回覆速度

    2012年5月23日 下午 03:05
  • 如果是這樣的話,我建議你檢查 proxy 設定,包含本機及公司網域的 proxy 設定。

    INTERNET_FLAG_RELOAD 是強制重整,通常是因為 proxy 造成 ftp 問題才需要下這個參數。

    所以在上面網址璉璉的程式碼中可以找到:

    hFileConnection = FtpFindFirstFile(hFtpSession, strFileName, sWFD, 0, 0)
    If hFileConnection = 0 Then
       hFileConnection = FtpFindFirstFile(hFtpSession, strFileName, sWFD, INTERNET_FLAG_RELOAD, 0)
    End If
    
    ' 略
    
    If hFileConnection > 0 Then
       fTime = GetWin32FindDataValue(sWFD, WFD_LastWriteTime)
    
       myFtpGetFile = FtpGetFile(hFtpConnect, strFileName, sFullFile, False, INTERNET_FLAG_RELOAD, TransferFlags, AddressOf myInternetSetStatusCallback)
       
       mySetFileTime sFullFile, CDate(myLocalTimeToSystemTime(fTime))
    End If
    


    從程式碼中來看,是兩種都嘗試,先用標準參數連線,如果失敗再強制重整。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年5月23日 下午 03:25
  • 心冷前輩 :

    謝謝提供另一個思考方向

    我使用了你提供璉大的Code作了以下的確認 :

    1 . 防火牆全關 :

     a. InternetConnect中的dwFlags參數使用 PASSIVE 或者 RELOAD

     b. FtpFindFirstFile中的dwFlags參數使用 0 , PASSIVE , RELOAD , NEED_FILE

       以上的 2 x 3的組合均可正確操作 (但基於種種因素不能將防火牆關閉)

    2. 防火牆正常開啟

     a . FtpFindFirstFile中的dwFlags參數使用 0 , PASSIVE , RELOAD , NEED_FILE --> 已無關成敗

         因為依璉大的Code中當使用0或者PASSIVE進行取檔案LIST時,SERVER在進行第一次取得資料時已經異常中

         在切換成RELOAD 時SERVER已不回應,回傳值亦會是0

     b . InternetConnect中的dwFlags參數使用 PASSIVE 或者 RELOAD

         使用PASSIVE --> 如a項的說明

         使用RELOAD  --> a項中的任一參數均能成立

    以上

    2012年5月24日 上午 04:07