6 个解决方案
#1
假设两台内网机器(A,B)的外网IP是222.222.222.222,服务端IP/Port是333.333.333.333:3000
A发送IdUDPClient.Send('333.333.333.333', 3000, 'A');
B发送IdUDPClient.Send('333.333.333.333', 3000, 'B');
然后在服务端的OnUDPRead中写上:
就知道A和B是不是你所谓的"同一个端口"了
A发送IdUDPClient.Send('333.333.333.333', 3000, 'A');
B发送IdUDPClient.Send('333.333.333.333', 3000, 'B');
然后在服务端的OnUDPRead中写上:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
S: string;
begin
if AData.Size = 0 then Exit;
SetLength(S, AData.Size);
AData.Read(S[1], AData.Size);
Memo1.Lines.Add(Format('%S %S:%D', [S, ABinding.PeerIP, ABinding.PeerPort]));
end;
就知道A和B是不是你所谓的"同一个端口"了
#2
我很久没开发了!
>>并使用同样的端口发送信息,idUDPserver在局域网外,idUDPserver怎样向这两个客服端发送信息呀?一般使用IP:端口方式吧,但是局域网内的客服端大网IP是一样的呀,端口也设置为一样的,怎么就收信息呢?
实际上,所谓的端口一样,是连接 idUDPserver的端口一样,而客户端一般是一个随机的端口和server端连接的,所以不存在冲突
嗯,楼上的代码,应该可以体现该问题
>>并使用同样的端口发送信息,idUDPserver在局域网外,idUDPserver怎样向这两个客服端发送信息呀?一般使用IP:端口方式吧,但是局域网内的客服端大网IP是一样的呀,端口也设置为一样的,怎么就收信息呢?
实际上,所谓的端口一样,是连接 idUDPserver的端口一样,而客户端一般是一个随机的端口和server端连接的,所以不存在冲突
嗯,楼上的代码,应该可以体现该问题
#3
路过帮顶
#4
路过留痕
认真学习
认真学习
#5
假定局域网Lan1当中运行有A和B两个客户端,
A(192.168.1.29:3000)
B(192.168.1.23:3000)
他们同在Lan1当中,而Lan1连接公网使用的是
G(192.168.1.1),它有一个外网IP:202.9.20.4
另外有一台服务器S(202.87.12.34:3001)
发送报文的流程就是
A( 192.168.1.29:3000) -> G(192.168.1.1-NAT转换- 202.9.20.4:2003) -> S( 202.87.12.34:3001)
B( 192.168.1.23:3000) -> G(192.168.1.1(NAT转换)- 202.9.20.4:2004) -> S( 202.87.12.34:3001)
这个时候,对于A和B都是从本机的3000端口发送到S的3001端口,而对于S看到的是G的2003和2004两个端口发来消息。
从业务来讲,如果A和B没有在报文当中声明自己是A或者B,那么S完全就有理由认为是G从两个端口发来的两个报文,而不需要理会到底是G发出来的还是G后面的A或者B或者C还是D发出来的。只须一一做出处理即可
A(192.168.1.29:3000)
B(192.168.1.23:3000)
他们同在Lan1当中,而Lan1连接公网使用的是
G(192.168.1.1),它有一个外网IP:202.9.20.4
另外有一台服务器S(202.87.12.34:3001)
发送报文的流程就是
A( 192.168.1.29:3000) -> G(192.168.1.1-NAT转换- 202.9.20.4:2003) -> S( 202.87.12.34:3001)
B( 192.168.1.23:3000) -> G(192.168.1.1(NAT转换)- 202.9.20.4:2004) -> S( 202.87.12.34:3001)
这个时候,对于A和B都是从本机的3000端口发送到S的3001端口,而对于S看到的是G的2003和2004两个端口发来消息。
从业务来讲,如果A和B没有在报文当中声明自己是A或者B,那么S完全就有理由认为是G从两个端口发来的两个报文,而不需要理会到底是G发出来的还是G后面的A或者B或者C还是D发出来的。只须一一做出处理即可
#6
基本理解了,谢谢
#1
假设两台内网机器(A,B)的外网IP是222.222.222.222,服务端IP/Port是333.333.333.333:3000
A发送IdUDPClient.Send('333.333.333.333', 3000, 'A');
B发送IdUDPClient.Send('333.333.333.333', 3000, 'B');
然后在服务端的OnUDPRead中写上:
就知道A和B是不是你所谓的"同一个端口"了
A发送IdUDPClient.Send('333.333.333.333', 3000, 'A');
B发送IdUDPClient.Send('333.333.333.333', 3000, 'B');
然后在服务端的OnUDPRead中写上:
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
S: string;
begin
if AData.Size = 0 then Exit;
SetLength(S, AData.Size);
AData.Read(S[1], AData.Size);
Memo1.Lines.Add(Format('%S %S:%D', [S, ABinding.PeerIP, ABinding.PeerPort]));
end;
就知道A和B是不是你所谓的"同一个端口"了
#2
我很久没开发了!
>>并使用同样的端口发送信息,idUDPserver在局域网外,idUDPserver怎样向这两个客服端发送信息呀?一般使用IP:端口方式吧,但是局域网内的客服端大网IP是一样的呀,端口也设置为一样的,怎么就收信息呢?
实际上,所谓的端口一样,是连接 idUDPserver的端口一样,而客户端一般是一个随机的端口和server端连接的,所以不存在冲突
嗯,楼上的代码,应该可以体现该问题
>>并使用同样的端口发送信息,idUDPserver在局域网外,idUDPserver怎样向这两个客服端发送信息呀?一般使用IP:端口方式吧,但是局域网内的客服端大网IP是一样的呀,端口也设置为一样的,怎么就收信息呢?
实际上,所谓的端口一样,是连接 idUDPserver的端口一样,而客户端一般是一个随机的端口和server端连接的,所以不存在冲突
嗯,楼上的代码,应该可以体现该问题
#3
路过帮顶
#4
路过留痕
认真学习
认真学习
#5
假定局域网Lan1当中运行有A和B两个客户端,
A(192.168.1.29:3000)
B(192.168.1.23:3000)
他们同在Lan1当中,而Lan1连接公网使用的是
G(192.168.1.1),它有一个外网IP:202.9.20.4
另外有一台服务器S(202.87.12.34:3001)
发送报文的流程就是
A( 192.168.1.29:3000) -> G(192.168.1.1-NAT转换- 202.9.20.4:2003) -> S( 202.87.12.34:3001)
B( 192.168.1.23:3000) -> G(192.168.1.1(NAT转换)- 202.9.20.4:2004) -> S( 202.87.12.34:3001)
这个时候,对于A和B都是从本机的3000端口发送到S的3001端口,而对于S看到的是G的2003和2004两个端口发来消息。
从业务来讲,如果A和B没有在报文当中声明自己是A或者B,那么S完全就有理由认为是G从两个端口发来的两个报文,而不需要理会到底是G发出来的还是G后面的A或者B或者C还是D发出来的。只须一一做出处理即可
A(192.168.1.29:3000)
B(192.168.1.23:3000)
他们同在Lan1当中,而Lan1连接公网使用的是
G(192.168.1.1),它有一个外网IP:202.9.20.4
另外有一台服务器S(202.87.12.34:3001)
发送报文的流程就是
A( 192.168.1.29:3000) -> G(192.168.1.1-NAT转换- 202.9.20.4:2003) -> S( 202.87.12.34:3001)
B( 192.168.1.23:3000) -> G(192.168.1.1(NAT转换)- 202.9.20.4:2004) -> S( 202.87.12.34:3001)
这个时候,对于A和B都是从本机的3000端口发送到S的3001端口,而对于S看到的是G的2003和2004两个端口发来消息。
从业务来讲,如果A和B没有在报文当中声明自己是A或者B,那么S完全就有理由认为是G从两个端口发来的两个报文,而不需要理会到底是G发出来的还是G后面的A或者B或者C还是D发出来的。只须一一做出处理即可
#6
基本理解了,谢谢