问题: 讨论Udp的工作原理(怎样实现OICQ聊天的程序) ( 积分: 300 )
分类: 局域网 / 通讯
来自: wjh_wy, 时间: 2003-10-08 9:47:00, ID: 2218066
请教一个问题:
是否可以从外部IP的电脑发送到对方外部IP电脑的局域网的任何一台。
大家畅所欲言,只要跟Udp有关的都可以讨论。
来自: wjh_wy, 时间: 2003-10-09 11:35:00, ID: 2220537
怎样实现不同局域网内通讯的问题。这个问题如果解决不了,我就通过服务器中转进行通讯。但如果要支持代理进行互相通讯,就要解决Socks5编程的问题,大家是否有这方面的资料呢。
来自: 宁柯, 时间: 2003-10-09 11:55:00, ID: 2220590
请您看这个帖子
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2217851
这是我回答的别人的问题, 他问的问题几乎和您一样!
来自: 宁柯, 时间: 2003-10-09 11:59:00, ID: 2220602
告诉我您的邮箱,我给您发一个类似QQ的程序,您看看就明白了!
来自: -_-;, 时间: 2003-10-09 12:33:00, ID: 2220692
反弹端口。
来自: wjh_wy, 时间: 2003-10-09 13:52:00, ID: 2220913
谢谢大家的热情参与,更感谢宁柯能把自己的东西与家分享。
E-Mail:wjh_wy@163.com
MSN:wjh_hot@hotmail.com
QQ:39306255
宁柯你就发到我的E-Mail吧,顺便问一下你的QQ号,有问题想请教大侠您。
来自: 宁柯, 时间: 2003-10-09 15:12:00, ID: 2221163
已经发送过了! 注意查收~!
我得QQ: 51581529
来自: wjh_wy, 时间: 2003-10-09 16:13:00, ID: 2221406
to 宁柯
您的程序是局域网之间的通讯,我要的是广域网上不同局域网之间的通讯,就是实现真真QQ哪样的程序,现在有一个问题就是没有解决Socks5代理的问题。不过还是非常感谢您。我的问题结束了会安问题回答情况,给您相应的分数。
-----------------------------------------
如果哪位大侠有Socks5方面的资料,请发到我的E-Mail。先谢了。
来自: 出现派, 时间: 2003-10-09 19:22:00, ID: 2221871
给我个QQ源码,谢谢
来自: chen_gxing, 时间: 2003-10-10 20:47:00, ID: 2223640
能不能也给我一份
来自: wjh_wy, 时间: 2003-10-10 21:00:00, ID: 2223660
直接下载,如果不行请看下面的两个链接:
ftp://new:newnew@61.129.70.192/datanew/2003101020552521685.rar
要原码的请看下面的链接
http://www.delphibbs.com/keylife/iblog_show.asp?xid=2704 --提供帐号
http://www.playicq.com/dispdocnew.php?id=9464 --提供原码
注意:
大家帮个帮提前一下。
来自: wjh_wy, 时间: 2003-10-10 21:00:00, ID: 2223667
我的问题还没有解决呀,大家是否有Socks5方面的资料呀。
来自: QSmile, 时间: 2003-10-24 10:06:00, ID: 2249688
to 宁柯
我也要
song.zhao@ckg.com.mo
来自: app2001, 时间: 2003-10-24 10:13:00, ID: 2249703
http://www.torry.net/vcl/internet/other/tmsnmessenger.zip
注释 MSN 全功能控件+源码
http://www.torry.net/samples/samples/internet/msnclone.zip
注释 一个照抄 MSN Messenger 的源码
http://www.torry.net/vcl/internet/other/adicqclient.zip
注释 全功能ICQ 控件+源码
http://www.torry.net/vcl/internet/other/icqpager.zip
注释 ICQ 专门发秘名信息的控件+源码!!!
来自: pldu, 时间: 2003-11-11 9:14:00, ID: 2285661
to:宁柯
能否给我一份?
pldu2002@163.com
谢谢!
来自: app2001, 时间: 2003-11-11 10:30:00, ID: 2285880
我刚从DELPHI盒子的FTP站点上下来,上面有一份关于ICQ的资料,可以去参考一下呀
来自: yu_ting, 时间: 2003-11-11 10:32:00, ID: 2285885
这样的资料非常多呀,许多教程上都有简单的例子,可以看看。
来自: midnightzero, 时间: 2003-11-11 13:38:00, ID: 2286437
在delphi的例子里面有相关的程序,也是聊天的程序
来自: wjh_wy, 时间: 2003-11-16 14:24:00, ID: 2297577
广域网的聊天程序呀。
来自: iie, 时间: 2003-11-24 10:37:00, ID: 2312815
服务器监听记录
客户端查询服务器后点对点端口发送
来自: wjh_wy, 时间: 2003-11-24 14:37:00, ID: 2313572
具体怎样做呢。
来自: wjh_wy, 时间: 2003-11-27 20:46:00, ID: 2320506
具体怎样做呀。
来自: summax, 时间: 2003-11-27 22:54:00, ID: 2320729
我也一样
来自: 41426277, 时间: 2003-11-29 8:39:00, ID: 2323269
我一直想不明用ADSL上网的电脑的IP去那里,
因为我的ADSL有自带路由功能,每台电脑设置192.168.1.X
要实现广域网的聊天程序,好难好难啊.
来自: 张辉明, 时间: 2003-11-29 21:00:00, ID: 2324254
delphi 自带的例子。netchar 可以实现!
来自: xhw801124, 时间: 2003-11-29 21:31:00, ID: 2324274
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2217851
来自: 乡村月光, 时间: 2003-12-01 23:57:00, ID: 2327604
如果你有公网IP的专用服务器,还用socks做什么啊?不同局域网在你服务器中转的情况下通讯是很简单的事情!自己写个中转服务程序就行了!
来自: 幕后黑手, 时间: 2003-12-02 1:35:00, ID: 2327646
QQ 是用服务器的哦。。。。
来自: 乡村月光, 时间: 2003-12-02 1:58:00, ID: 2327656
很多socks服务器不支持UDP
来自: wjh_wy, 时间: 2003-12-02 8:43:00, ID: 2327755
怎样实现UDP代理功能,或者谁有UDP通讯的例子(完全用Winsock完成的,不要用第三方控件)。
来自: huiyue, 时间: 2003-12-02 10:32:00, ID: 2328110
to:宁柯
能否给我一份?
songyuehua@163.net
谢谢!
来自: wjh_wy, 时间: 2003-12-12 13:56:00, ID: 2350057
大家讨论一下好吗。
来自: wjh_wy, 时间: 2003-12-12 13:56:00, ID: 2350060
NAT是什么怎样编程实现。
来自: wjh_wy, 时间: 2003-12-12 17:51:00, ID: 2350768
Symmetric NAT
A symmetric NAT, in contrast, does not maintain a consistent
port binding between (private IP, private port) and (public IP,
public port) across all sessions. Instead, it assigns a new
public port to each new session. For example, suppose Client A
initiates two outgoing sessions from the same port as above, one
with S1 and one with S2. A symmetric NAT might allocate the
public endpoint 155.99.25.11:62000 to session 1, and then allocate
a different public endpoint 155.99.25.11:62001, when the
application initiates session 2. The NAT is able to differentiate
between the two sessions for translation purposes because the
external endpoints involved in the sessions (those of S1
and S2) differ, even as the endpoint identity of the client
application is lost across the address translation boundary.
Server S1 Server S2
18.181.0.31:1235 138.76.29.7:1235
| |
| |
+----------------------+----------------------+
|
^ Session 1 (A-S1) ^ | ^ Session 2 (A-S2) ^
| 18.181.0.31:1235 | | | 138.76.29.7:1235 |
v 155.99.25.11:62000 v | v 155.99.25.11:62001 v
|
Symmetric NAT
155.99.25.11
|
^ Session 1 (A-S1) ^ | ^ Session 2 (A-S2) ^
| 18.181.0.31:1235 | | | 138.76.29.7:1235 |
v 10.0.0.1:1234 v | v 10.0.0.1:1234 v
|
Client A
10.0.0.1:1234
The issue of cone versus symmetric NAT behavior applies equally
to TCP and UDP traffic.
Cone NAT is further classified according to how liberally the NAT
accepts incoming traffic directed to an already-established (public
IP, public port) pair. This classification generally applies only to
UDP traffic, since NATs and firewalls reject incoming TCP
connection attempts unconditionally unless specifically configured to
do otherwise.
Full Cone NAT
After establishing a public/private port binding for a new
outgoing session, a full cone NAT will subsequently accept
incoming traffic to the corresponding public port from ANY
external endpoint on the public network. Full cone NAT is
also sometimes called "promiscuous" NAT.
Restricted Cone NAT
A restricted cone NAT only forwards an incoming packet directed to
a public port if its external (source) IP address matches the
address of a node to which the internal host has previously sent
one or more outgoing packets. A restricted cone NAT effectively
refines the firewall principle of rejecting unsolicited incoming
traffic, by restricting incoming traffic to a set of "known"
external IP addresses.
Port-Restricted Cone NAT
A port-restricted cone NAT, in turn, only forwards an incoming
packet if its external IP address AND port number match those of
an external endpoint to which the internal host has previously
sent outgoing packets. A port-restricted cone NAT provides
internal nodes the same level of protection against unsolicited
incoming traffic that a symmetric NAT does, while maintaining a
private port's identity across translation.
//能否把大概的意思帮我翻译一下。
文章出自于: http://cnscenter.future.co.kr/resource/ietf/ind-draft/draft-ford-midcom-p2p-00.txt
来自: chengl, 时间: 2003-12-17 14:51:00, ID: 2360066
我完成了socket5代理且是在公网上的的,但是我现在想用socket4或http的,不知道有没有谁能解决
来自: wjh_wy, 时间: 2003-12-17 15:16:00, ID: 2360161
to chengl
Socks5兼容Socks4,Socks4没有身份验证,而Socks5增加了身份验证。
能否把你的代码贴出来大家共享呢。Http代理希望有解决把代码贴出来大家共享。
来自: 乡村月光, 时间: 2003-12-17 22:44:00, ID: 2361190
socks代理已经解决,可以连进来或连出去,Http代理可以用Http tunnel,不过好象不支持UDP,TCP连出去没问题,连进来还没搞清楚,不知道可不可以实现
来自: lyjgs.168, 时间: 2003-12-18 12:28:00, ID: 2362070
to:宁柯
能否给我一份?
LYJGS.168@163.com
谢谢!
来自: yangying_2000, 时间: 2003-12-18 12:55:00, ID: 2362140
to chengl
你说的完成了SOCKS5代理指的是TCP还是UDP?
to 乡村月光
你说socks代理已经解决,可以连进来或连出去,你又是TCP还是UDP?
qq:7310159
mail:yangying_2000@163.com
SOCKS代理有几个版本,到SOCKS5才出现UDP ASSOCIATE的标准,我看不太明白
另外,对于两个UDP的程序如果都在内网,想通过外网通讯的话,有两种方式
一是NAT(网络地址转换,NET ADDRESS TRANSLATE),这是所有网吧所用的方式,象SYGATE就是软网关,可完成NAT的功能.
二是代理,就是刚刚说的SOCKS,UDP的代理到了SOCKS5才支持的,这样的通讯需要客户端的支持,我一直没做出来,SYNAPSE的UDP类号称支持UDP ASSOCIATE,但是我测试过,只能单向通讯,总之不是QQ的那种SOCKS5代理
来自: wjh_wy, 时间: 2003-12-18 13:26:00, ID: 2362234
请大家不要再叫宁柯发源代码好吗,他的源码在这里:
http://www.eFile.com.cn/eFile/jxcjsh/Demos/Chat.rar
来自: 乡村月光, 时间: 2003-12-18 14:34:00, ID: 2362403
连接自然是TCP,UDP不需要连接的。有socks代理,TCP一样能实现不同局域网内通讯。
SYNAPSE确实支持UDP ASSOCIATE,可以双向通讯,可能是你使用的问题,无论是TCP或UDP,在这种情况下都需要一个握手服务器取得对方的实际地址。
来自: yangying_2000, 时间: 2003-12-18 15:41:00, ID: 2362645
to 乡村月光
你的QQ多少,或者加我也行
另外,能否写个这样的例子给我,用SYNAPSE
A是客户端,B是服务器,都采用UDP的协议通讯,A通过SOCKS5代理也就是UDP ASSOCIATE发送一个文本给B,B收到后返回该文本的长度给A,这个例子应该很简单吧,麻烦你了
来自: wjh_wy, 时间: 2003-12-18 18:31:00, ID: 2363127
TO 乡村月光
能不能发我一份呀。
来自: sunjunfeng3, 时间: 2003-12-18 20:22:00, ID: 2363325
我要也一个 sunjunfeng3@163.com
来自: yangying_2000, 时间: 2003-12-19 9:46:00, ID: 2363929
to 乡村月光
兄弟,很多人都在等你呢,帮帮大家吧
来自: 乡村月光, 时间: 2003-12-19 14:35:00, ID: 2364802
我以前测试的时候写过一个程序,在两台机器上运行可以相互发消息。发送和接收的消息都保存在一个listbox里,接收到的消息以*号开头,发送的消息以-号开头,发出的消息如果对方有回应,前面的-号变成+号。
unit UdpMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, blcksock;
const
WM_TERMINATE = WM_USER + 1;
WM_UDPDOSEND = WM_USER + 2;
WM_UDPRECVED = WM_USER + 51;
type
TUDPRecvThread = class(TThread)
public
procedure Execute; override;
end;
TUDPSendThread = class(TThread)
public
procedure Execute; override;
end;
TUDPForm = class(TForm)
Label1: TLabel;
ListMsg: TListBox;
EdAddrTo: TEdit;
Label2: TLabel;
EdPortTo: TEdit;
Label3: TLabel;
Panel1: TPanel;
Label4: TLabel;
Label5: TLabel;
EdAddrSocks: TEdit;
Label6: TLabel;
EdPortSocks: TEdit;
Label7: TLabel;
EdUserName: TEdit;
Label8: TLabel;
EdPassword: TEdit;
BtnSend: TButton;
Label9: TLabel;
EdMsg: TEdit;
Label10: TLabel;
EdPortLocal: TEdit;
BtnStart: TButton;
BtnExit: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure BtnSendClick(Sender: TObject);
procedure BtnExitClick(Sender: TObject);
procedure BtnStartClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure OnUDPRecved(var ms: TMessage); message WM_UDPRECVED;
end;
var
UDPForm: TUDPForm;
implementation
{$R *.dfm}
var MsgIn, MsgOut: string;
UDPSock: TUDPBlockSocket;
UDPRecv: TUDPRecvThread;
UDPSend: TUDPSendThread;
Sending: Boolean;
procedure TUDPRecvThread.Execute;
var m, n: Integer;
s: string;
begin
FreeOnTerminate := True;
while not Terminated do
begin
MsgIn := UDPSock.RecvPacket(3000);
if UDPSock.LastError = 0 then
begin
if MsgIn[1] = 'R' then
begin
Delete(MsgIn, 1, 1);
Val(MsgIn, m, n);
if n = 0 then PostMessage(UDPForm.Handle, WM_UDPRECVED, m, 0);
end
else if MsgIn[1] = 'M' then
begin
Delete(MsgIn, 1, 1);
n := Pos('M', MsgIn);
if n > 0 then
begin
s := 'R' + Copy(MsgIn, 1, n - 1);
Delete(MsgIn, 1, n);
MsgIn := '*[' + UDPSock.GetRemoteSinIP + ':' + IntToStr(UDPSock.GetRemoteSinPort)
+ ']' + MsgIn;
UDPSock.SendBufferTo(@s[1], Length(s));
PostMessage(UDPForm.Handle, WM_UDPRECVED, -1, 0);
Suspend;
end;
end;
end;
end;
UDPRecv := nil;
end;
procedure TUDPSendThread.Execute;
var ms: MSG;
begin
FreeOnTerminate := True;
while not Terminated do
begin
GetMessage(ms, 0, 0, 0);
case ms.message of
WM_UDPDOSEND:
begin
if Length(MsgOut) > 0 then with UDPSock, UDPForm do
begin
SocksIp := EdAddrSocks.Text;
SocksPort := EdPortSocks.Text;
SocksUsername := EdUsername.Text;
SocksPassword := EdPassword.Text;
Connect(EdAddrTo.Text, EdPortTo.Text);
SendString(MsgOut);
Sending := False;
end;
end;
WM_TERMINATE: Terminate;
end;
end;
UDPSend := nil;
end;
procedure TUDPForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
BtnExitClick(Sender);
Action := caFree;
end;
procedure TUDPForm.BtnSendClick(Sender: TObject);
var n: Integer;
begin
if Sending then
begin
ShowMessage('上一条消息还未发送完成,请稍候!');
Exit;
end;
Sending := True;
n := ListMsg.Count;
MsgOut := 'M' + IntToStr
+ 'M' + EdMsg.Text;
ListMsg.Items.Append('-[' + EdAddrTo.Text + ':' + EdPortTo.Text + ']' + EdMsg.Text);
PostThreadMessage(UDPSend.ThreadID, WM_UDPDOSEND, 0, 0);
end;
procedure TUDPForm.OnUDPRecved(var ms: TMessage);
var s: string;
begin
if ms.WParam < 0 then
begin
ListMsg.Items.Append(MsgIn);
UDPRecv.Resume;
Exit;
end;
s := ListMsg.Items[ms.WParam];
s[1] := '+';
ListMsg.Items[ms.WParam] := s;
end;
procedure TUDPForm.BtnExitClick(Sender: TObject);
begin
if Assigned(UDPRecv) then UDPRecv.Terminate;
if Assigned(UDPSend) then PostThreadMessage(UDPSend.ThreadID, WM_TERMINATE, 0, 0);
while Assigned(UDPRecv) do Sleep(100);
while Assigned(UDPSend) do Sleep(100);
if Assigned(UDPSock) then
begin
UDPSock.CloseSocket;
UDPSock.Free;
UDPSock := nil;
end;
BtnStart.Enabled := True;
EdMsg.Enabled := False;
BtnSend.Enabled := False;
EdPortLocal.Enabled := True;
BtnExit.Enabled := False;
end;
procedure TUDPForm.BtnStartClick(Sender: TObject);
begin
BtnStart.Enabled := False;
Sending := False;
UDPSock := TUDPBlockSocket.Create;
with UDPSock do Bind(ResolveName(LocalName), EdPortLocal.Text);
UDPRecv := TUDPRecvThread.Create(False);
UDPSend := TUDPSendThread.Create(False);
EdMsg.Enabled := True;
BtnSend.Enabled := True;
EdPortLocal.Enabled := False;
BtnExit.Enabled := True;
end;
procedure TUDPForm.FormCreate(Sender: TObject);
begin
UDPRecv := nil;
UDPSend := nil;
UDPSock := nil;
BtnStart.Enabled := True;
EdMsg.Enabled := False;
BtnSend.Enabled := False;
EdPortLocal.Enabled := True;
BtnExit.Enabled := False;
end;
end.
来自: yangying_2000, 时间: 2003-12-19 16:29:00, ID: 2365105
to 乡村月光
我刚刚测试过你的代码,当没用设置SOCKS代理时没问题,设置了代理后没法回复,我用的是WINGATE3,你测试下如何,如果你那可以,麻烦你把代码和执行程序都打包给我,谢谢
来自: 乡村月光, 时间: 2003-12-19 21:23:00, ID: 2365598
使用代理服务器时,需要先使用代理服务的一方发一条消息,另一方收到后要用列表中显示的地址和端口回复!但无论如何自动回复应该是成功的,即你发出消息后消息前面的-号如果变成了+号,就证明是成功的。
我以前测试过没问题的,这里现在没办法测试,网关禁止了UDP,这也是我后来不用UDP的原因。如果你需要完整的代码和执行程序,请留下email,我QQ是21449301或29953513,不过很少上:)
来自: wjh_wy, 时间: 2003-12-20 8:48:00, ID: 2365899
to 乡村月光
你代码我还没有试,我等你把源码发给我再试,我这里有比较好的测试环境,希望一起讨论。
QQ:39306255
来自: JamesBond_L, 时间: 2003-12-20 8:51:00, ID: 2365905
收藏
来自: yangying_2000, 时间: 2003-12-21 12:43:00, ID: 2367510
to 乡村月光
qq:7310159
mail:yangying_2000@163.com
来自: 乡村月光, 时间: 2003-12-21 16:08:00, ID: 2367706
邮件已发
来自: wjh_wy, 时间: 2003-12-25 18:36:00, ID: 2375443
to 乡村月光
mail:wjh_wy@163.com
来自: duronshi, 时间: 2003-12-25 19:54:00, ID: 2375563
E-Mail:smallshi@163.com
QQ:15932551
宁柯你就发到我的E-Mail吧,顺便问一下你的QQ号,有问题想请教大侠您
来自: wjh_wy, 时间: 2003-12-25 20:01:00, ID: 2375574
[red]请大家不要再叫宁柯发源代码好吗,他的源码在这里:[/red]http://www.eFile.com.cn/eFile/jxcjsh/Demos/Chat.rar
来自: cxreal, 时间: 2004-02-02 10:47:00, ID: 2430962
学习
来自: DouZheng, 时间: 2004-02-02 11:03:00, ID: 2431002
to:宁柯
能否给我一份?
douzheng@sina.com
谢谢!
来自: go_huang, 时间: 2004-02-19 17:06:37, ID: 2462407
to:宁柯
能否给我一份?
go_Huang@hotmail.com
谢谢!
来自: 国手, 时间: 2004-04-02 15:44:36, ID: 2536216
to:宁柯
能否给我一份?
g27384955@hotmail.com
谢谢!
来自: LM007, 时间: 2004-04-02 21:06:19, ID: 2536847
to:宁柯
能否给我一份?
lmoop@tom.com
谢谢!
来自: wjh_wy, 时间: 2004-08-03 11:37:12, ID: 2745772
多人接受答案了。
来自: constantine, 时间: 2004-12-17 14:16:03, ID: 2934730
http://www.eFile.com.cn/eFile/jxcjsh/Demos/Chat.rar
下不了啊
来自: 5411, 时间: 2005-01-09 1:54:31, ID: 2957692
fengxiaobao@zdf-sd.com请帮忙给一份学习学习
问题讨论没有结束 ...