C 的UDP打洞試驗

2021-03-31 15:26:27 字數 3864 閱讀 3650

公共**:

///

/// 使用者類

///

public class user

}///

/// 使用者位址屬性

///

public endpoint location

}///

/// 返回乙個使用者例項

///

/// 使用者名稱

/// 使用者位址

public user(string _name, endpoint _location)}}

客戶端程式**:

using system;

using system.***;

using system.***.sockets;

using system.text;

using system.threading;

using system.collections;

namespace client

break;

case p2pmsg:

console.writeline("/n收到來自" +  encoding.unicode.getstring(data,4, 20) +

"的訊息:" + encoding.unicode.getstring(data,24, recv - 24));

sock.sendto(encoding.unicode.getbytes(recmsg), remote);

console.write("/n#***mand:");

break;

case holdmg:

break;

case pingmg:

break;}}

}/*使用者登入*/

static string userlogin()

username = username.padright(10,' ');

byte data = encoding.unicode.getbytes(login + username.toupper());

sock.sendto(data,serverep);

//todo:記得在此新增超時處理

int recv = sock.receive(data);

if(encoding.unicode.getstring(data,0, recv) == loginok)

else

}/*傳送訊息*/

static private bool sendmsg(string name, string msg)

for(int i=0; i

sock.sendto(toserv, serverep);

thread.sleep(1000);

sock.sendto(toclient,((user)users[index]).location);

}if(!ok)

else

}else

return result;

}/*獲取使用者列表*/

static private void getuserlist(byte data, int recv)

}/*查詢使用者*/

static private int finduser(string _name)

}return result;

}static void waituserlist()

if(more)

else

}#endregion

///

/// 應用程式的主入口點。

///

[stathread]

static void main(string args)

catch

}loop = true;

/*使用者登入*/

while(username == "")

listenthr.start();

while(loop)

switch(input.substring(0,4).tolower())

else

break;

case users:

if(input.length == 4)

else

break;

case sendmsg:

if(input.length > 5  && input[4] == ' ')

string name = input.substring(5,nindex-5).toupper();

string msg = input.substring(nindex+1);

sendmsg(name, msg);       

}else

break;

case exit:

if(input.length==4)

else

break;

case ping:

if(input.length > 5 && input[4] == ' ')

else

break;

case help:

showhelp();

break;

default:

console.writeline("'" +input+"'" +"不是有效命令!/n");

break;}}

}}

伺服器端程式**:

using system;

using system.collections;

using system.***;

using system.***.sockets;

using system.text;

using system.threading;

namespace server}}

/*查詢使用者*/

static private int finduser(string _name)

}return result;

}/*使用者登入*/

static private void userlogin(byte data, endpoint _remote)

}else

}/*使用者下線*/

static private void userlogout(byte data)

}sock.sendto(userdata, remote);

}sock.sendto(encoding.unicode.getbytes(msgend),remote);

}/*命令進行端到端連線*/

static private void peerconnect(byte data, endpoint remote)

else

}#endregion

///

/// 應用程式的主入口點。

///

[stathread]

static void main(string args)

switch(input.substring(0,4).tolower())

else

break;

case exit:

listenthr.abort();

byte data = encoding.unicode.getbytes(servcls);

for(int i=0; i

sock.close();

loop = false;

break;

default:

console.writeline("'" +input+"'" +"不是有效命令!/n");

break;}}

}}

用空再解釋udp打洞是怎麼回事,**寫的很亂,請大家見諒!

這個試驗我做了很多次都沒成功,不知道是不是****錯了~~~有空得檢查下。

TCP打洞和UDP打洞

1,tcp協議通訊 現在有兩台電腦a和b。在 假設a的位址為 192.168.0.100 假設b的位址為 192.168.0.102 a想給b傳送乙個字串hello,如果a,b之間採用tcp協議,那麼b收到hello的過程是怎樣的呢?首先建立連線 3次握手成功之後,a和b的鏈結才算成功 然後a在給b...

UDP打洞原理

許多p2p軟體比如skype,qq,電驢之類需要不同內網的兩台機子進行通訊,而路由器的nat機制決定了內網訪問外網容易,而外網訪問內網困難,那如何才能做到這一點呢?有辦法 打洞 具體實現方法需要一台伺服器,現在假設兩台內網pc,a和b想用埠40000通訊,閘道器分別為nata,natb.伺服器為s,...

UDP打洞原理

許多p2p軟體比如skype,qq,電驢之類需要不同內網的兩台機子進行通訊,而路由器的nat機制決定了內網訪問外網容易,而外網訪問內網困難,那如何才能做到這一點呢?有辦法 打洞 具體實現方法需要一台伺服器,現在假設兩台內網pc,a和b想用埠40000通訊,閘道器分別為nata,natb.伺服器為s,...