请问下面这两段发送UDP的代码为什么在VC做的SERVER端一个能显示CLIENT的IP和端口,一个不能呢?(100分)

  • 主题发起人 主题发起人 cjsam
  • 开始时间 开始时间
C

cjsam

Unregistered / Unconfirmed
GUEST, unregistred user!
Type
TDataFormat=record
Head:Byte;
SerNumber:Byte;
StreamLen:array[0..1] of byte;
stream:array [0..512] of char;
end;
var
MyStream: TMemoryStream;
str,TmpStr: String;
Tmpstr1:TDataFormat;
1。能显示IP的:
try
MyStream.Write(TmpStr[1], Length(TmpStr));
NMUDP1.SendStream(MyStream);
finally
MyStream.Free;
end;
2.不能显示的,但是能收到数据包:
with TmpStr do
begin
Head:=$30;
SerNumber:=FrameSeq+1;
streamlen[0]:=0;
StreamLen[1]:=Length(str);
for i:=0 to Length(str)-1 do
Stream:=(str[i+1]);
end;
MyStream:=TMemoryStream.Create;
try
MyStream.Write(TmpStr, sizeof(TDataFormat));
LoginUDP.SendStream(Mystream);
finally
MyStream.Free;
end;

[red]请问为什么?不明白。我用2种和别人连调,他能收到我发过去的数据包,但是就是
没有我的IP和断口,他发不回来。[/red]
 
你确认是你的问题,而不是他的问题?
 
TO zw84611,
应该是哟,因为第一种他就能接受到也,第一种是发个字符窜,
而第二中定义了个记录,写成流就不行了。大家给点指点嘛!
 
只要他能收到你的数据,那说明IP和端口没有错。
第二种,他能收到你的数据,只是显示的不对?
 
to zw84611,
显示的断口号为0,IP为空,数据包里的数据是对的。
 
你怎么知道他的程序是对的?
端口号是事先设好的,根本不用在接收后判断。如果你发出去的包的IP不对,那他根本
不可能收到!
 
LoginUDP也是一个TNMUDP吗? 设置了host/port吗?
 
LoginUDP是个NMUDP,当然设置了host/port

[red]来自:zw84611, 时间:2002-11-21 8:31:00, ID:1446831
你怎么知道他的程序是对的?
端口号是事先设好的,根本不用在接收后判断。如果你发出去的包的IP不对,那他根本
不可能收到!
[/red]
因为他收到我的包后要判断我的登陆PASSWORD的正确与否,然后返回我,他是一个固定IP,
而我的是个动态IP,也就是这次交互的时候IP 是这个,瑕疵就不一定了,他收到的UDP包里
应该包含我的IP和PORT,但是他收到的返回不了我的这些信息,但是我用第一中方式和他通讯
他就能受到显示HOST/PORT,只有能显示后,在这次交互中他才能返回我的登陆权限的。
 
原因我找到了。在定义的记录中
Type
TDataFormat=record
Head:Byte;
SerNumber:Byte;
StreamLen:array[0..1] of byte;
stream:array [0..512] of char;[red]不能定义成数组,定义成字符串就行了,但是那样服务端收到的数据就又不对了。
有谁知道改怎样改吗?[/red]
end;
如果只是显示我发的UDP包的带的IP/PORT。就上面注释的地方改成String就行了,VC写的
服务端收到的包里就有了IP/PORT,但是传过去的数据包就不对了。有谁知道到底改怎样改呀,我的分不多,不然肯定多给,以后补上吧!
 
UDP包的带的IP/PORT在哪儿?TDataFormat中怎么没有呀?
 
一点建议,你的record应该定义成packed record,尤其是这种混合语言编程的,
VC只认packed record的。而且最好不要用string。 建议如下:
TDataFormat=[red]packed [/red]record
Head:Byte;
SerNumber:Byte;
StreamLen:array[0..1] of byte;
stream:array [0..512] of char;
end;

虽然这不一定是造成你的问题的原因,但是劝你先改正了然后再测试,
否则以后还会有别的问题。

(packed record才能保证sizeof(TDataFormat)的准确,不信你试一试)
 
TO zw84611,
可能你没用明白我的意思。UDP包里自己带的有都有IP/PORT的。不用我定义。
TO 一个过客,
谢谢,我试试,以前没注意到。改了后还是不行的。
 
我给你搞糊涂了。

“因为他收到我的包后要判断我的登陆PASSWORD的正确与否,然后返回我,他是一个固定IP,
而我的是个动态IP,也就是这次交互的时候IP 是这个,瑕疵就不一定了,他收到的UDP包里
应该包含我的IP和PORT,但是他收到的返回不了我的这些信息,但是我用第一中方式和他通讯
他就能受到显示HOST/PORT,只有能显示后,在这次交互中他才能返回我的登陆权限的。”

1.你总不会先发一个UDP包,然后马上改IP,然后再和他通信吧?

2.对方可以用RecvFrom获得IP,Port总是固定的吧。既然你不是把IP和Port放在报文里传给对方的,
IP和Port和你发送数据的内容是没有关系的。既然他能收到,他怎么可能不知道你的IP和Port呢?
 
TO zw84611,
现在就是这个问题了,他能收到呀,但是IP/PORT他那RecvFrom获得的就是:127。0。0。0/0
就是这样的,所以我才问呀?
对于我说的那是,比如情况我刚发了LOGIN包,然后我吊线了,重新拨号上来,IP和PORT肯定和
上一个不一样了呀。
 
原来是拨号,我明白了。但我很奇怪,他能收到你的数据,但RecvFrom得到的地址却不对,
而且居然和发送数据有关,真是怪异!
 
zw84611,
对呀,就是奇怪了,一样的程序,我就把定义的那个记录里面最后一个字段有数组该成STRING
服务段(VC程序)就能显示正常的IP/PORT。
我就不知道怎的了,反正把数据做成一个流,发出去的为什么会和数据内容有关?疑惑!
 
多人接受答案了。
 
后退
顶部