公共**:
///
/// 使用者類
///
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,...