當前位置:首頁 » 操作系統 » tcp穿透源碼

tcp穿透源碼

發布時間: 2022-09-08 08:06:44

① TCP客戶端程序源代碼如何編寫

int client() { system("color 0a"); //修改DOS窗口顏色,是其成0A。 WORD wVersion=MAKEWORD(1,1); WSADATA wsData; int nResult= WSAStartup(wVersion,&wsData); //啟動WINSOCKET if(nResult !=0) { printf("啟動Winsock失敗!\n"); } SOCKET sc=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); //創建套接字 if(sc==INVALID_SOCKET) { printf("創建套接字失敗!\n"); } SOCKADDR_IN addrSc; addrSc.sin_family=AF_INET; addrSc.sin_port=htons(portNum); //保證位元組順序 char IP[20]; again: printf("請輸入伺服器的IP地址:"); gets(IP); if( -1==inet_addr(IP) ) //循環檢測IP地址是否合法 { printf("IP地址錯誤!\n"); goto again; } addrSc.sin_addr.S_un.S_addr=inet_addr(IP); int b=0; while(b<5) //檢測5次,如果伺服器在此時間內啟動,則進行連接 { nResult=connect(sc,(SOCKADDR*)&addrSc,sizeof(SOCKADDR)); //套接字連接 Sleep((DWORD)100); //延時1秒 if(nResult==SOCKET_ERROR) { printf(" %d 次連接失敗!\n",b+1); } else break; b++; } if(nResult==SOCKET_ERROR) { printf("登陸超時,請重新登陸!\n"); goto again; } char *buf="連接成功!"; //向服務端驗證連接成功 nResult=send(sc,buf,strlen(buf)+1,0); if(nResult==SOCKET_ERROR) { printf("5.套接字發送數據失敗!\n"); return 0; } char mess[M]; nResult =recv(sc,mess,strlen(mess),0); //接受服務端的連接驗證信息 if(nResult == -1 ) //判斷服務端是否關閉 { printf("\n服務端已斷開\n"); system("pause"); exit(0); } printf("%s\n",mess); tianle: system("cls"); //清屏 puts("\n\n"); puts(" * * "); puts(" * 歡·迎·使·用·局·域·網·文·件·發·送·工·具 *"); puts(" * (客 戶 端) * "); puts(" * * "); puts(" * * "); puts(" * 請等待服務端的相應操作 * "); puts(" * * "); puts(" * * "); puts(" * 天樂軟體工作室製作 * "); puts(" * 2008-3-1 * "); puts(" * 版權所有★歡迎傳播 * "); puts("全屏(退出全屏)操作請按:ALT+ENTER\n"); char rMess[100]; nResult=recv(sc,rMess,strlen(rMess),0); //接收服務端發來的操作請求 if(nResult==-1) //判斷服務端是否關閉 { printf("\n服務端已斷開\n"); system("pause"); goto tianle; } printf("%s\n",rMess); char ch; char str[100]; gets(str); ch=str[0]; while( ch!='Y' && ch!='y' && ch!='N' && ch!='n' ) //處理客戶端的錯誤輸入 { printf("輸入有誤,請重新輸入(Y/N):"); gets(str); ch=str[0]; } send(sc,&ch,sizeof(char),0); //向服務端反饋選擇,並執行相應操作 if(strcmp(rMess,"服務端向你傳送文件,是否接受(Y/N):")==0 && (ch=='Y' || ch=='y') ) { receiveFile(sc); } if(strcmp(rMess,"服務端向你發起聊天,是否接受(Y/N):")==0 && (ch=='Y' || ch=='y') ) { chatting_client(sc); } if(ch=='N' || ch=='n') { printf("你拒絕了!\n"); system("pause"); } system("cls"); goto tianle; nResult=closesocket(sc); //關閉套接字 if(nResult==SOCKET_ERROR) { printf("8.關閉套接字失敗!\n"); return 0; } }

滿意請採納

② 求TCP/IP 源代碼 要求有中文注釋~~~~~

lz說的應該不是協議,而是實現TCP/IP協議內容的具體代碼,如C語言等;《用TCP/IP進行網際互聯第二卷:設計、實現與內核》(第三版)【Internetworking
With
TCP/IP
Vol
II:Designed,Implementation,and
Internals
Third
Edition】上有C代碼實現,但沒有中文注釋,只有英文注釋,我想應該沒有中文注釋教材的吧,有也不好找的,反正我沒見過,呵呵!

③ C# TCP 打洞/穿透NAT

這個很簡單啊...沒有外網IP沒關系.如果你是通過路由上網.在路由上做個埠印射,你的機器就能當外網IP伺服器用了.

打洞通常是UDP協議.TCP協議的打洞還真沒試過.

補充:你是沒伺服器,還是沒伺服器端代碼~~

④ 如何讓IdTCPServer&IdTCPClient的應用穿透NAT

讓IdTCPServer&IdTCPClient的應用穿透NAT?

2007-03-15 22:35:28| 分類: delphi程序備忘 |字型大小 訂閱
IdTCPServer擁有公網IP和開放的埠,
IdTCPClient位於NAT之後,沒法埠映射,
但是由IdTCPClient主動發起連接,連接之後互相傳遞文件.
在IdTCPClient的屬性里BoundIP和BoundPort不用填,使用如下代碼就能穿透NAT連接IdTCPServer:

IdTCPClient.Host := 『0.0.0.0』;//IdTCPServer公網IP
IdTCPClient.Port := 0; //IdTCPServer的埠
try
IdTCPClient.Connect();
except
IdTCPClient.Disconnect;
exit;
end;

要注意的是,IdTCPServer一定要在擁有公網IP的機子上運行,這樣可以使得世界任何地方的電腦用上述代碼就能跟IdTCPServer相連接,
連接上後,可以用IdTCPServer的OnConnect取得IdTCPClient經過NAT轉換後的IP和Port,代碼如下:

procere TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
IP := AThread.Connection.Socket.Binding.PeerIP ;
Port := AThread.Connection.Socket.Binding.PeerPort;
end;

使用IdTCPServer的OnConnect獲得的IP和Port才能與IdTCPClient通訊。
你會發現OnConnect里獲得的IP和Port和未經過NAT轉換後的IdTCPClient的機子的IP和Port大不一樣。

⑤ 請問有沒有C#的 TCP/IP 穿透的源碼,要會打洞的哪種,謝謝!

我最簡單方法告訴你好了 ,你像伺服器發送信息的時候,你的路由器會開一個外網ip,
比如說你的IP埠:192.168.1.2:8000->(伺服器)76.73.46.122:9000,你的外網IP(123.46.177.23)對把,NAT會自動幫你開一個埠,比如123.46.177.23:62000好了,然後你伺服器只要發數據到123.46.177.23:62000這個埠,你的內網就自動收到。明白了把 那個NAT埠是自動開 不用人工去設置,

如果還不懂的話 等我有空寫一個控制項 就知道了

⑥ C# tcp編程 內網穿透是怎麼回事

「把伺服器端掛在獨立主機上」
看你的消息是通過伺服器轉發的,還是點對點發的。
如果是點對點發的,就需要NAT穿透。否則找不到對方

⑦ TCP、UDP穿透NAT

A與B如果IP相同,則用內網方案。

A與B的IP不相同的話,
A請求伺服器讓B給A發個打洞消息。如果能接收到B的應答,就說明通了。(在這里是通過線程,有一個最大嘗試次數)

A -> 發送打洞請求給C
C -> 發送命令給B,B接到命令後
B -> 發送打洞回應消息給A,一直嘗試N次
如果A能接受到B的回應,就通了。

不知道描述的對不對。

⑧ TCP穿透NAT

談談我的理解:
首先,tcp不同於udp,tcp天生就是不對等的連接,因此穿透nat就顯得很困難。
最為簡單的一種方式:
客戶端:a,b
伺服器端(公網)c
a發送消息給c,同時c拿到a的ip埠等信息,將a提出的請求轉發給已與c連接的b,b表示同意後發送消息給c,c將消息反饋給a,同時為a和b的通信做准備(分配埠等等),整個過程是客戶端到伺服器再到客戶端,c起中轉作用,a與b建立連接實際是a與c,b與c建立的連接。
一般對於可靠性要求較低的應用會使用udp實現。
優點:適用於所有類型網路,簡單;
缺點:佔用帶寬,速度慢。
早期的msn就是這種方式。
第二種方式:TCP的p2p技術。
這種方式是目前最熱門的,我也正在看。
轉一下來自cmu(卡耐基梅隆)牛人們的研究:
××××××××××××××××
原文:http://www.andrew.cmu.e/user/ggw/WBFD.pdf

由於工作需要,在網上找了很長時間P2P的資料,好像只有《P2P 之 UDP穿透NAT的原理與實現(附源代碼)》比較有實際意義,可惜又是用UDP實現的,無奈只好找了份英文資料啃,發現很有參考價值,就根據理解翻譯了一部分,分享給大家,由於水平有限,有錯望多多包涵。如果有人能夠繼續翻譯下去別忘了通知我哦呵呵,[email protected],感謝。

摘要
防火牆和網路地址轉換(NAT)設備對於傳統的P2P協議存在一定的問題。一些中間設備抑制了來自外部網路到內部網路的TCP請求,這篇文章的目的就是尋找一個能夠在兩個NAT設備內部的主機間建立TCP連接的方法。我們已經在兩個普通的硬體條件下實現了這個功能。

1.入門
由於32位IP地址的減少,現在出現了很多通過一個internet地址代理內部網路上網的設備,這就是NAT技術。這些設備對於INTERNET已經越來越重要了,但是它們的獨立發展因為缺乏標准而對現在的internet協議造成危害。

2.技術
典型的NAT和防火牆設備都是不允許外部地址主動請求而進入內部網路的,如果用戶的程序需要在兩個內部網路間建立直接性的連接,那麼兩個內部設備之間必須是相互信任的。如果A和B兩個部分都初始化了TCP連接,NAT設備就會認為它們之間是相互信任的,也就允許它們之間的連接了。
圖1是一個例子,目標是能夠讓A和B(分別在NATA和NATB後)建立TCP連接。
我們討論了多種在特定的NAT設備環境下的TCP連接方案。
如果我們的情況如下:
1、可預測NA的埠,可預測NB的埠,可指定源IP的特定路由
2、可預測NA的埠,可預測NB的埠,不可指定源IP的特定路由
3、隨機的NA埠,可預測NB的埠,可指定源IP的特定路由
4、隨機的NA埠,可預測NB的埠,不可指定源IP的特定路由
5、隨機的NA埠,隨機的NB埠,可指定源IP的特定路由
6、隨機的NA埠,隨機的NB埠,不可指定源IP的特定路由

我們必須作出這4種假設:
1、 兩個主機都不受NAT設備所限制;
2、 我們可以配置網路設備使得主機看不到來自外部網路的ICMP包(TTL超過限制),因為這些ICMP數據包無論被任何一方接收到都是中斷TCP連接。我們討論的一些解決方案就依賴通過發送一個初始TTL很小的SYN包來建立TCP連接。一旦SYN包被路由器丟棄,ICMP TTL 超時包就會被傳送到NAT設備,我們不允許NAT設備將這個超時TTL的返回包傳送到內部網路,即使NAT會將這個包傳送到內部,也需要通過配置防火牆來限制這個包到達主機;
3、 即使NAT設備看到ICMP超時的數據包,設備本身的映射表將不會作任何改動;
4、 內部網路的其它主機不會佔用搶占這個埠,因為如果網路特別繁忙,這個埠可能會無效。

3.1第一種情況
我們可以通過圖2表示的順序解決問題:
1)A和B可以設定LSR(IP報頭中的一個選項)通過X路由發送SYN數據包.
2)X可以緩存它們的數據包並且發送欺騙的SYN+ACKS給NA和NB.
3)A和B可以通過由X發送來的數據進行應答.
4)X丟棄這兩個ACK包,因為它已經可以確定A和B相互應答成功.

圖2是假設A和B都事先彼此的NAT的通信埠,A知道B的通信埠是NB:5000,B知道A的是NA:4000,並且要求X不在任何NAT設備的後面.實際中這兩個埠是預測得到的,預測過程如圖3:

3.2第二種情況
第一種情況依賴與自由設定路由,但是現在很多路由器大多都限制這樣做,並且會丟棄這樣的服務請求包。因此在實際應用中,這種方案失敗的可能性很大。如果自由設定路由不可行,我們可以通過out-of-band通道(他們預先與X連接好的TCP連接)來傳送原本必須將數據包路由到X才能看到的包。注意在圖二的第二步X已經知道了TCP的序號Q和P,因為X已經收到了這兩個SYN包,但是如果數據包沒有路由經過X就不可能收到它們。為了初始化這個連接,兩個主機發送初始SYN包,並且他們都知道是不可能到達目標的,但是它們都可以記住自己的SYN號(個人看法,通過鉤子獲得發送的數據SYN包)並且可以發送給X,X得到了它們的SYN包,就可以欺騙它們發送ACK包了。有兩種方法可以發送無法到達目標的數據包。簡單的方法就是每個主機發送一個SYN給對方,要求應答包不會到達內部網路.如果NAT(防火牆)會將應答包傳回給內部網路,通常是發送TCP的reset包(RST),如果NAT生成RST包,A和B就不能簡單地發送一個向圖2中SYN給彼此,因為如果這樣NA和NB就無法打洞了呵呵,如果NAT不發送RST包,那麼這個TCP連接就不會被中斷。另外一個發送無法到達目標網路的SYN包的方法是減小TTL值,使它們無法彼此到達。如果用戶無法配置防火牆丟棄這個ICMP應答包,或者NAT不繼續傳送這個ICMP,這個TCP就不會立即關閉。這個解決方案不能使用一種簡單的欺騙,因為我們必須保證源地址的SYN包發送者不會沒有收到ICMP的RST包,否則會導致中間設備建立錯誤路由.僅僅依靠SYN包,NAT就可以建立從internet IP和埠到外部IP和埠的路由.由於欺騙的SYN包是錯誤的源IP(並非發出者X),這個路由將不會發送到X而是發送到NA或者NB。另外,這種方案都需要設置TTL到足夠小,以便於對方的NAT不會收到到各自發出的初始SYN包,否則就無法完成打洞。(圖4)

3.3第三種情況
比前兩種簡單,但是X將無法預見NA或者NB的埠。B將先給X發送一個SYN包告訴以便於X知道它所選用的埠號,然後X將這個信息發送到A,A就可以向這個確定的地址和埠發送SYN,圖5是第一種情況的變形::
1)X向圖3一樣預測埠,但是它不能預測到NA的下一個埠號,但是可以預測NB的下一個埠號是5000,並且可以通知A和B這個節點已經建立了連接;
2)A和B同步節點X;
3)X可以欺騙A和B;
4)A和B相互發送ACK;
5)X丟棄發給它的ACK,因為它已經可以確認它們已經建立連接。

××××××××××××××××
第三種:實現vpn,通過安全的虛擬連接實現,而這樣的話就不存在穿透問題,因為vpn是個虛擬網路,tcp在其中是被信任的。

⑨ vb.net2005 怎麼用TCP來穿透內網

當然是網關地址
所謂穿透內網,是需要一台具有公共 IP 的主機做轉發的

⑩ 求一C語言寫的tcp程序的源碼,程序越簡單越好,C++也可以,最好帶注釋

最簡單的那種?我給你寫一個=,=
//伺服器
#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

#include <netdb.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

#include <unistd.h>

main()

{
//創建套接字

int serverSocket= socket(AF_INET,SOCK_STREAM,0);

struct sockaddr_in server_addr;

struct sockaddr_in clientAddr;

int addr_len = sizeof(clientAddr);
int client;
char buffer[200];

//創建地址

bzero(&server_addr,sizeof(server_addr));

server_addr.sin_family =AF_INET;

server_addr.sin_port = htons(5555);

server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

//綁定

bind(serverSocket,(struct sockaddr *)&server_addr,sizeof(server_addr));
//幀聽

listen(serverSocket,5);
printf("客戶端發過來的 :\n");
//接收
client=accept(serverSocket,(sockaddr *)&clientAddr,(socklen_t*)&addr_len);
printf("客戶端發過來的 :\n");
while(1)
{
if(recv(client,buffer,sizeof(buffer),0)>0)
printf("客戶端發過來的 : %s\n",buffer);
}
return 0;
}

//客戶端
#include <sys/stat.h>

#include <fcntl.h>

#include <errno.h>

#include <netdb.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <string.h>

#include <stdlib.h>

#include <stdio.h>

#include <unistd.h>

main()

{

struct sockaddr_in serverAddr;

int clientSocket=socket(AF_INET,SOCK_STREAM,0);

char sendbuf[200];

//創建地址信息

serverAddr.sin_family=AF_INET;

serverAddr.sin_port=htons(5555);

serverAddr.sin_addr.s_addr=inet_addr("127.0.0.1");

//連接伺服器

connect(clientSocket,(sockaddr*)&serverAddr,sizeof(serverAddr));

printf("連接目標主機中.....\n連接完成......\n");

//

while(1)

{

printf("請輸入發給伺服器的數據 : ");

scanf("%s",sendbuf);

//strcmp函數作用,比較兩個東東(按ASCII值大小相比較),相同就==0。

if(strcmp(sendbuf,"x")==0)

break;

send(clientSocket,sendbuf,sizeof(sendbuf),0);

}

close(clientSocket);

return 0;

}

熱點內容
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:711
php跳過if 發布:2025-05-12 15:34:29 瀏覽:465
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:129
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:163
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:732
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:147
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:395
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:539
access資料庫exe 發布:2025-05-12 12:39:04 瀏覽:627
五開的配置是什麼 發布:2025-05-12 12:36:37 瀏覽:363