剛剛寫了個DEMO,在內網來測試SQL2000後完全正常。現在想測試外網是否正常,畢竟路由器IP不固定,所以選擇了路由器+花生殼免費網域名稱(koma.5166.info),所以先安裝花生殼用戶端軟體。下面是我在這過程中遇到的一些問題:
1、理論上將1433連接埠映射出去(這個連接埠是SQL2000伺服器預設的連接埠)
結果發現程式、SQL查詢分析器都無法串連伺服器。這時我排除WINDOWS防火牆、關閉瑞星防火牆與殺毒軟體仍無法串連。
於是乎查閱相關資料,網上的資料真的太多,涉及到的參數與設定太多,估計是大多人喜歡轉載來轉載去的,真不知道他們自己實踐過沒有。結果仍然沒有成功!
2、SQL2000 SP4補丁程式
這是很多地方看到最多的一個方法,於是先下載安裝完這個補丁後,發現DEMO程式與SQL查詢分析器還是無法正確串連,於是查看連接埠監聽狀態,在命令列輸入netstat -an
C:/Documents and Settings/Koma>netstat -an</p><p>Active Connections</p><p> Proto Local Address Foreign Address State<br /> TCP 0.0.0.0:135 0.0.0.0:0 LISTENING<br /> TCP 0.0.0.0:445 0.0.0.0:0 LISTENING<br /> TCP 0.0.0.0:1433 0.0.0.0:0 LISTENING<br /> TCP 0.0.0.0:6059 0.0.0.0:0 LISTENING<br /> TCP 127.0.0.1:1026 0.0.0.0:0 LISTENING<br /> TCP 127.0.0.1:1036 127.0.0.1:1025 CLOSE_WAIT<br /> TCP 127.0.0.1:1038 127.0.0.1:1025 CLOSE_WAIT<br /> TCP 192.168.1.100:139 0.0.0.0:0 LISTENING<br /> UDP 0.0.0.0:445 *:*<br /> UDP 0.0.0.0:1434 *:*<br /> UDP 127.0.0.1:123 *:*<br /> UDP 127.0.0.1:1049 *:*<br /> UDP 127.0.0.1:1239 *:*<br /> UDP 127.0.0.1:1900 *:*<br /> UDP 192.168.1.100:123 *:*<br /> UDP 192.168.1.100:137 *:*<br /> UDP 192.168.1.100:138 *:*<br /> UDP 192.168.1.100:1900 *:*</p><p>C:/Documents and Settings/Koma>
此時我關閉所有那些無關的應用程式,於是將上面所有偵聽的連接埠全部隱射出去,最終排鎖定在兩個連接埠:1433與445。
3、DEMO程式相關代碼
A、建立串連時的代碼:
BOOL CQDlg::OnInitDialog()<br />{<br />......</p><p>// Set the icon for this dialog. The framework does this automatically<br />// when the application's main window is not a dialog<br />SetIcon(m_hIcon, TRUE);// Set big icon<br />SetIcon(m_hIcon, FALSE);// Set small icon</p><p>// TODO: Add extra initialization here<br />//初始化COM介面<br />if (!AfxOleInit())<br />{<br />AfxMessageBox("初始化com介面失敗");<br />}<br />HRESULT hr;<br />try<br />{<br />// 建立Connection對象<br />hr = m_pConnection.CreateInstance("ADODB.Connection");<br />if(SUCCEEDED(hr))<br />{<br />// 串連資料庫成功<br />hr = m_pConnection->Open("Provider=SQLOLEDB;Server=koma.5166.info,1433;DataBase=student;UID=sa;PWD=","","",adModeUnknown);<br />// MessageBox("資料庫連接成功!");<br />}<br />}<br />catch(_com_error e)<br />{<br />// 捕捉異常<br />CString errormessage;<br />errormessage.Format("串連資料庫失敗!/r/n錯誤資訊:%s",e.ErrorMessage());<br />AfxMessageBox(errormessage);///顯示錯誤資訊<br />}<br />return TRUE;<br />}
B、程式運行效果:
C、SQL查詢分析器:
4、總結
MS SQL2000“表面”上看起來像只是1433連接埠在偵聽,但實際上還有個445連接埠也在偵聽,兩者缺一不可。 所以讓外網主機訪問內網SQL2000伺服器必須先安裝SP4補丁(打補丁前請先備份好自己重要的資料),再將1433與445連接埠兩個都從NAT裝置中映射出去即可。
至於為什麼需要同時偵聽這兩個連接埠,哪位友友知道的麻煩告訴我一下,謝謝啊!