① 做一個C/S程序,客戶端和伺服器之間可以通過外網相互連接進行通信 遇到的問題是客戶端如何獲取本機的外網
最簡單的就是在後台起個線程,訪問http://www..com/s?wd=ip&rsv_spt=1&issp=1&rsv_bp=0&ie=utf-8&tn=home_pg&rsv_sug3=1&rsv_sug=0&rsv_sug1=1&rsv_sug4=40這個地址,然後把本機IP欄位給截取下來就知道本機的外網地址了。
還有種方法就是客戶端連接下伺服器,伺服器將客戶端的地址傳回客戶端。
② C/S模式外網如何訪問
埠問題,確定你這個軟體需要用到的埠,檢查接入設備和防火牆的埠設置。
其實這種方式是不安全的,還不如通過伺服器系統再帶的撥入做個簡單的VPN,這樣安全性相對要高一些。
③ Linux C語言編程如何跨公網進行通信
在C語言的網路編程中,公網及區域網是沒有區別的,跨公網的通信是通過網路硬體設備(路由器、三層交換機),而不是通過軟體實現的
④ C語言寫的區域網聊天工具怎樣應用到外網
看你的程序怎麼寫的,如果是使用TCP或者UDP偵聽,指定IP地址進行鏈接,那是肯定沒有問題的,什麼環境都可以使用。
但是如果是使用廣播方式發送消息,那就只能區域網使用,一般的路由器都會過濾廣播。
補充:
只要不是依賴廣播的就可以用,無需修改,依賴廣播的修改為指定地址鏈接(一對一)。沒看見你的程序,誰知道怎麼修改。
⑤ 請問 C# 如何獲取外網IP
本機是獲取不到自己外網IP的,真的想要知道,你可以訪問ip138這種網站,讓這種網站獲得你的IP再返回給你。有點兒像自己的眼睛是看不到自己長啥樣,想要看得是鏡子「獲得」你的樣子,然後再返還給你一樣。
路由什麼的是基於NAT的,根本不需要知道客戶端的真實地址是什麼,服務端地址固定住就好了。當客戶端與服務端連接時(建立Sockets)經過路由,路由會NAT給客戶端一個地址(包含IP和埠號兩部分),服務端只需要往這個地址上發送信息,路由器識別你這個地址會自動轉發給相應的真正的客戶端的,這也就是路由的本身作用。
⑥ 請教怎麼實現C/S模式上的遠程訪問
這個要看網路結構,server掛在外網,直接可以實現,若掛在內網,需在路由器做個埠映射;且有固定IP或域名
可以直接連伺服器IP,當然,你需要打sp4補丁,開放1433埠等等,
如果要固定IP,可以弄個個花生殼的軟體
⑦ 我用C#做了一個C/S結果的管理軟體,伺服器和客戶端怎麼在外網通信
我暑假的時候也遇到這樣的問題,給一個公司做C/S管理軟體,最終是這樣解決的:在花生殼 注冊了個動態域名,因為這個公司走的是ADSL網,你知道IP是不停地變的,然後在連接字元串的地方把IP換成域名。之後呢,在公司出口的路由上做了埠轉發:將所有從外網的訪問轉發到區域網內的伺服器的IP上(伺服器區域網內IP已經固定),並且制定了轉發給1433埠(SQLSERVER)。這樣軟體無論在外網還是內網都可以訪問SQLSERVER了。有什麼問題可以再交流,呵呵
⑧ 區域網如何訪問外網
重新設置一下區域網,參照以下步驟:
1、工作組要相同。 具體操作: 右鍵 我的電腦 屬性 計算機名 更改工作組。
2、禁用「GUEST」帳戶。 具體操作:右鍵 我的電腦 管理 本地用戶和組 雙擊用戶 點 GUEST 右鍵 屬性 賬戶已停用前勾上。
3、更改本地帳戶的安全和共享模式為經典。具體操作:開始 設置 控制面板 性能和維護 管理工具 本地安全策略 安全選項 網路訪問:本地賬號的共享和安全模式 選 「經典:本地用戶以自己的身份驗證」。
4、若想實現文件和列印機共享,要開啟各機的共享。
你試試,祝你成功!
徹底解決XP網上鄰居共享
導致Windows XP網路鄰居不能正確瀏覽或瀏覽列表不全的因素很多,解決問題需要對症下葯,而診斷過程分兩個步驟:測試基本連接、解決文件共享問題。
一、解決基本連接問題。
1、檢查計算機之間的物理連接。
網卡是網路連接的基本設備,在桌面計算機中,每個網卡後面的指示燈應該是亮的,這表示連接是正常的。如果不亮,請檢查集線器或交換機是打開的,而且每個客戶端連接的指示燈都是亮的,這表示鏈接是正常的。接下來檢查網線的水晶頭是否接觸良好。
2、確保所有計算機上都安裝了 TCP/IP,並且工作正常。
在Windows XP 中默認安裝了 TCP/IP。但是,如果出了網路問題想卸載後重新安裝 TCP/IP 就不容易了:在「本地連接」屬性中顯示的此連接使用下列項目列表中單擊 Internet 協議 (TCP/IP) 項,您將發現卸載按鈕不可用(被禁用)。
這是因為傳輸控制協議/Internet 協議 (TCP/IP) 堆棧是 Microsoft XP/ 2003 的核心組件,不能刪除。在這種情況下,如果需要重新安裝 TCP/IP 以使 TCP/IP 堆棧恢復為原始狀態。可以使用 NetShell 實用程序重置 TCP/IP 堆棧,使其恢復到初次安裝操作系統時的狀態。 方法是:在命令提示符後鍵入以下命令,然後按 ENTER 鍵:netsh int ip reset c:\resetlog.txt,其中,Resetlog.txt記錄命令結果的日誌文件,一定要指定,這里指定了 Resetlog.txt 日誌文件及完整路徑。運行此命令的結果與刪除並重新安裝 TCP/IP 協議的效果相同。
另外,不會還有人用95吧,WIN95默認情況下不自動安裝TCP/IP協議。
3、檢查IP地址
有幾種情況:
查看不同的計算機的IP是否在同一范圍內,方法是在MSDOS方式下輸入IPCONFIG/ALL。如果一台計算機收到的地址在 192.168.0.x 范圍內,而另一台收到的地址在 169.254.x.y 范圍內,需要根據網路拓撲確定哪一個是正確的地址。然後,集中解決地址錯誤的那台計算機的問題。
關於169.254.x.y類IP地址
在不存在 Internet 連接的情況中,或者,每台計算機都有一個單獨的 Internet 連接(撥號連接或寬頻連接)。在這種配置中,計算機通常給自己分配 169.254.x.y 范圍內的 IP 地址(其中 x 和 y 是 1 到 254 之間的數字)。而將 ISP 提供的地址用於 Internet 連接。
關於192.168.0.X類IP地址
一台計算機通過使用 Internet 連接共享連接到共享的Internet。該連接可以是撥號連接或寬頻連接(一般是 xDSL 或電纜數據機)。該計算機也被稱為代理伺服器,常見的代理有SYGATE、WINGATE、NAT、ISA、CCPROXY等。通常是由代理伺服器負責為家庭網路中的其他計算機分配 IP 地址。共享連接的計算機應該為連接到家庭網路的網卡配置 IP 地址 192.168.0.1。網路上其他計算機的地址應在 192.168.0.x 范圍內(其中 x 是 2 到 254 之間的數字)。當然,可以在成功共享後修改IP地址,如10.X.Y.Z等。
計算機連接到集線器,並且集線器通過寬頻連接與 Internet 連接。這種配置也稱為無邊界網路。在這種配置中,家庭網路中的每台計算機都有一個 Internet 服務提供商 (ISP) 提供的 IP 地址。使用的地址因 ISP 而異。無邊界網路是一種特殊情況。在這種情況下應使用 ICF,但必須採取其他措施才能在家庭網路啟用連接。
4、使用 ping 命令測試網路中兩台計算機之間的連接:
ping 其它計算機IP,在命令提示處,鍵入 ping x.x.x.x(其中 x.x.x.x 是另一台計算機的 IP 地址),然後按 ENTER 鍵。應該可以看到來自另一台計算機的幾個答復,如:
Reply from x.x.x.x:bytes=32 time<1ms TTL=128
如果沒有看到這些答復,或者看到"Request timed out",說明本地計算機可能有問題。如果 ping 命令成功執行,那麼您就確定了計算機可以正確連接,可以跳過下一步。如果沒有看到這些答復,或者看到"Request timed out",說明本地計算機可能有問題。PING 本地IP,如果看到"Request timed out",說明本地計算機可能有問題。
5、 使用 ping 命令測試網路中名稱解析是否正常
ping computername,其中 computername 是遠程計算機的名稱。通過 ping 命令用名稱測試計算機連接。確定計算機的名稱的方法是:在命令提示處,輸入SYSTEMINFO。或者在桌面上右擊我的電腦-屬性,然後單擊計算機名稱選項卡。如果看到該命令的成功答復,說明您在計算機之間具有基本連接和名稱解析。名稱解析跟NETBIOS密切相關,看下面的步驟。
6、分析日誌
檢查"網路安裝向導"日誌文件中沒有成功執行的任何步驟中的錯誤。打開該日誌的方法是依次單擊開始、運行,鍵入 %SystemRoot%\nsw.log,然後按 ENTER 鍵。 如果 Nsw.log 文件沒有提供有關該問題的信息,請檢查系統日誌中的錯誤並查明錯誤原因。
二、解決文件和列印機共享問題
1、正確安裝網路組件
首先右擊網上鄰居-屬性,選擇要共享的網卡。把IP設置在區域網的同一個網段上。比如192.168.0.X網段。然後看一下TCP/IP的高級屬性中,是否開啟NETBIOS 。在利用WINNT4.0 構建的網路系統中,對每一台主機的唯一標識信息是它的NetBIOS名,系統是利用WINS服務、信息廣播方式及Lmhost文件等多種模式將NetBIOS名解析為相應IP地址,從而實現信息通訊。在內部網路系統中(也就是通常我們所說的區域網中),利用NetBIOS名實現信息通訊是非常方便、快捷的。但是在Internet上對一台主機的唯一標識信息是它的FQDN格式的域名(http://www.163.com/),在Internet是利用DNS標准來實現將域名解析為相應IP地址,WIN2K支持動態DNS,運行活動目錄服務的機器可動態地更新DNS表。WIN2K網路中可以不再需要WINS服務,但是WIN2K仍然支持WINS,這是由於向後兼容的原因。目前,大多數網路是混合網,既有Win98等系統,又有WINXP/WIN2K等系統,因此需要在TCP/IP協議上捆綁NETBIOS解析計算機名。
查看是否選定「文件和列印服務」組件,如果已將其取消選中,「瀏覽服務」將不綁定到 NetBIOS 介面。成為備份瀏覽器並且沒有啟用「文件和列印共享」的基於 Windows 的計算機無法將瀏覽列表與客戶機共享。任何將要包括在瀏覽列表中的計算機也都必須啟用「文件和列印共享」。
2、啟動"計算機瀏覽器"服務
計算機瀏覽器"服務在網路上維護一個計算機更新列表,並將此列表提供給指定為瀏覽器的計算機。如果停止了此服務,則既不更新也不維護該列表。
啟動"計算機瀏覽器"服務
單擊開始,右擊我的電腦,然後單擊管理。
在控制台樹中,展開"服務和應用程序"。
單擊服務。
在右邊的詳細信息窗格中,檢查"計算機瀏覽器"服務是否已啟動,右擊計算機瀏覽器,然後單擊啟動。
關閉"計算機管理"窗口。
3、查看共享文件夾
請依次單擊開始、運行,鍵入 fsmgmt.msc,然後單擊確定。在左窗格中,單擊共享。右窗格中隨即出現共享文件夾列表。記下每台計算機的相應共享名稱。
4、起用Guest(來賓)帳戶
Windows XP的Guest帳戶允許其他人使用你的電腦,但不允許他們訪問特定的文件,也不允許他們安裝軟體。對 Windows XP Home Edition 計算機或工作組中的 Windows XP Professional 計算機的所有網路訪問都使用來賓帳戶。使用net user guest確保為網路訪問設置了來賓帳戶,如果該帳戶是活動的,命令輸出中會出現一行類似下面這樣的內容:Account active Yes;如果該帳戶不是活動的,請使用下面的命令授予來賓帳戶網路訪問:
net user guest /active:yes
5、允許Guest(來賓)帳號從網路上訪問。
在運行里輸入gpedit.msc,彈出組策略管理器,在『計算機配置-Windows設置-本地策略-用戶權利指派』中,有「拒絕從網路訪問這台計算機」策略阻止從網路訪問這台計算機,其中居然有GUEST帳號,誰能訪問這台計算機。解決辦法是刪除拒絕訪問中的GUEST帳號。如圖
6、設置防火牆允許瀏覽服務
網路安全重要,所以最好開啟網路防火牆,但是防火牆阻斷正常的網路瀏覽服務通訊,結果是別人在網上鄰居中看不到你的計算機,有沒有兩全其美的辦法在開啟防火牆的前提下允許瀏覽服務。辦法是,如果開啟了ICF,打開屬性,在服務這欄,選擇添加,添加服務的對話框共有四個編輯框,最上邊是描述服務名稱,以便於記憶,從上到下第二個是應用服務的IP地址或名稱,輸入127.0.0.1表示本機。下面連個是內外埠號,旁邊的tcp/udp標示這個埠是udp連接還是tcp連接。
按照下面的表格輸入3個服務
名 稱 協 議 端 口
NetBIOS Name Service UDP 137
NetBIOS Datagram Service UDP 138
NetBIOS Session Service TCP 139
137/UDP -- NetBIOS 名稱伺服器, 網路基本輸入/輸出系統 (NetBIOS) 名稱伺服器 (NBNS) 協議是 TCP/IP 上的 NetBIOS (NetBT) 協議族的一部分,它在基於 NetBIOS 名稱訪問的網路上提供主機名和地址映射方法。
138/UDP -- NetBIOS 數據報,NetBIOS 數據報是 TCP/IP 上的 NetBIOS (NetBT) 協議族的一部分,它用於網路登錄和瀏覽。
139/TCP -- NetBIOS 會話服務,NetBIOS 會話服務是 TCP/IP 上的 NetBIOS (NetBT) 協議族的一部分,它用於伺服器消息塊 (SMB)、文件共享和列印。
Windows XP 最新的SP2補丁對ICF做了很大的改進,功能更強大了,ICF有了自己的設置項,安裝SP2後,默認情況下,啟用ICF防火牆,不允許任何外部主動連接,即使是本地的應用程序要訪問網路也需要在許可列表中做設置。
7、取消簡單文件共享
Windows 2000 操作系統中用戶在設置文件夾的共享屬性時操作非常簡便,只需用滑鼠右擊該文件夾並選擇屬性,就可以看到共享設置標簽。而在 Windows XP 系統設置文件夾共享時則比較復雜,用戶無法通過上述操作看到共享設置標簽。具體的修改方法如下:打開"我的電腦"中的"工具",選擇"文件夾屬性",調出"查看"標簽,在"高級設置"部分滾動至最底部將"Use simple file sharing (Recommended)"前面的選擇取消,另外如果選項欄里還有"Mickey Mouse"項也將其選擇取消。這樣修改後用戶就可以象使用Windows 2000一樣對文件夾屬性進行方便修改了。
對於 Windows XP Home Edition:
1.開機時按"F8"進入"帶網路連接的安全模式"
2.登錄後就可象在 Windows 其它版本中一樣設置共享許可權了。
8、設置帳號和密碼
由於WinNT內核的操作系統,在訪問遠程計算機的時候,好像總是首先嘗試用本地的當前用戶名和密碼來嘗試,可能造成無法訪問,在這里把用戶密碼添加進去就可以了。
9、多種方法訪問「網路計算機」
例如要打開網路中名為「IBMZB」的計算機,其IP地址為10.41.221.5,如果你不清楚其它機器的IP地址,你可以使用「PING計算機名」來獲得它的IP地址。
用計算機名訪問,NETBIOS提供的服務。點擊「開始」菜單,單擊「運行」,在運行欄輸入「\\IBM-ZB」,單擊「確定」。
用IP地址訪問,在運行輸入欄中輸入「\\10.41.221.5」,單擊「確定」。
用搜索計算機的方法訪問,計算機更新列表需要時間,搜索計算機可以加快更新列表。點擊「網上鄰居」右鍵中的「搜索計算機」,輸入計算機名,點擊「立即搜索」,就可以看到你要訪問的計算機。直接雙擊右邊計算機名就可以打開它了。
用映射驅動器的方法訪問,進入MS-DOS方式,輸入「NET VIEW \\IBMZB」,回車�這是查看計算機IBMZB上有哪些共享文件夾,如D。再輸入NET USE Z:\\IBMZB\D�將計算機IBM-ZB共享的文件夾D映射為H:盤,在命令提示符下鍵入「Z:」。你會發現你已經連到IBMZB計算機上了。
⑨ 如何從外部訪問路由器下的設備
做埠映射。一般在防火牆部分。把80埠直接映射到192.168.1.101上。或者,直接找到DMZ選項,把192.168.1.101設為DMZ地址,外網就可以直接訪問了。
⑩ C# TCP/IP中的客戶端和伺服器在區域網或外網怎麼通信呀誰有完整的例子呀.
這是我以前在學校的時候做的一個c/s系統裡面的類似qq聊天工具
你看看。。
這是客服端的代碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
namespace demo2
{
public partial class frmTouchWe : Form
{
Thread a;
//發送IP跟埠
private UdpClient udp = new UdpClient("127.0.0.1",9000);
//接收埠
private UdpClient udpSend = new UdpClient(8000);
private IPEndPoint ip = new IPEndPoint(IPAddress.Any,0);
public frmTouchWe()
{
InitializeComponent();
Form. = false;
}
private void frmTouchWe_Load(object sender, EventArgs e)
{ //定義線程開始
a = new Thread(new ThreadStart(Run));
a.Start(); }
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
//客服接收信息。彈出窗體
frmAnswerInfo answerInfo = new frmAnswerInfo();
answerInfo.Show(); }
private void button1_Click(object sender, EventArgs e)
{
//在自己的信息欄中顯示自己的信息
lsbInfo.Items.Add(txtInfo.Text);
//用戶信息內容
string Mes = txtInfo.Text;
//用戶信息
string mes = "用戶:"+Program.user.id+"("+Program.user.name+")"+" " + time;
//轉換成位元組
byte[] b = UTF8Encoding.UTF8.GetBytes(Mes);
byte[] bb = UTF32Encoding.UTF8.GetBytes(mes);
//發送信息
udp.Send(bb, bb.Length);
udp.Send(b, b.Length);
txtInfo.Text = "";
}
//循環接受客服發來的信息
private void Run()
{
while (true)
{
byte[] b = udpSend.Receive(ref ip);
string mes = UTF8Encoding.UTF8.GetString(b);
lsbInfo.Items.Add(mes);
}
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
private void button3_Click_1(object sender, EventArgs e)
{
//清空所有項
lsbInfo.Items.Clear();
}
}
}
下面是伺服器端的代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Net;
using System.Net.Sockets;
namespace demo2
{
public partial class frmAnswerInfo : Form
{
//定義一條線程,用來循環接收客戶發來的信息
Thread a;
//定義另一條線程,用來升起窗體
Thread b;
//發送到信息的地址
private UdpClient udpSend = new UdpClient("127.0.0.1",8000);
//接收埠
private UdpClient udp = new UdpClient(9000);
private IPEndPoint ip = new IPEndPoint(IPAddress.Any,0);
public frmAnswerInfo()
{
InitializeComponent();
Form. = false;
}
//循環接收信息
private void Run()
{
while (true)
{
byte[] b = udp.Receive(ref ip);
string mes = UTF8Encoding.UTF8.GetString(b);
lsbInfo.Items.Add(mes);
}
}
private void frmAnswerInfo_Load(object sender, EventArgs e)
{
//設置窗體的位置屬性(窗體載入時候慢慢從右下角升上來~類似qq廣告~~)
this.Top = Screen.PrimaryScreen.WorkingArea.Height;
this.Left = Screen.PrimaryScreen.WorkingArea.Width - this.Width;
//設置窗體的名字
a = new Thread(new ThreadStart(Run));
b = new Thread(new ThreadStart(run));
//開始線程
a.Start();
b.Start();
}
//用戶點擊談話時顯示該窗體
private void run()
{
while (true)
{
this.Top = this.Top - 10;
Thread.Sleep(100);
if (Screen.PrimaryScreen.WorkingArea.Height - this.Height >= this.Top)
{
break;
}
}
}
//發送按鈕編碼
private void button1_Click(object sender, EventArgs e)
{
//獲取當前時間
DateTime time = DateTime.Now;
//在自己的信息欄中顯示自己發出去的信息
lsbInfo.Items.Add("在線客服:"+time);
lsbInfo.Items.Add(txtInfo.Text);
//在客戶端顯示自己的信息標題
string mes = "在線客服:"+time;
//信息內容
string Mes = txtInfo.Text;
//發送信息標題
byte[] b = UTF8Encoding.UTF8.GetBytes(mes);
//發送信息內容
byte[] bb = UTF8Encoding.UTF8.GetBytes(Mes);
udpSend.Send(b, b.Length);
udpSend.Send(bb,bb.Length);
txtInfo.Text = "";
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
private void button3_Click(object sender, EventArgs e)
{
//清除所有項
lsbInfo.Items.Clear();
}
}
}
這個可以跑的。。我以前就用過的。