zw84611,哥们,帮着看看了,昨天的继续问题。关于UDP发送接受的问题。(0分)

  • 主题发起人 主题发起人 cjsam
  • 开始时间 开始时间
to zw84611,
没有,我只有一个测试程序,他每次收到的时候就是上面的情况,超过10个就歇菜了。在10
个内没问题。我估计不是VC的程序问题吧,因为他自己的客户端发给他都没问题
 
to zw84611:
他说他是这样实现这块的:
if (m_CSSocket.Create(6811,SOCK_DGRAM,FD_WRITE|FD_READ|FD_ACCEPT|FD_CLOSE,"172.18.16.186"))
m_CSSocket.Bind(6811,"172.18.16.186");
//邦定他自己的断口地址。UDP_LEN=512
char recv[UDP_LEN];
memset(recv,0,UDP_LEN);
CString userIP("127.0.0.1");
UINT port=0;
int iRecv = ReceiveFrom(recv,sizeof(recv),(CString&)userIP,port,0);
然后监听到SOCKET消息来后ReceiveFrom(recv,sizeof(recv),(CString&)userIP,port,0);
就直接收,在上面手的长度大于10的时候,(CString&)userIP,port总是显示默认值
127.0.0.1/0,当小于10的时候就显示我的IP/PORT了。
 
唉,我真的不知道为什么。他有没有试过用下面这个RecvFrom?
int ReceiveFrom( void* lpBuf, int nBufLen, SOCKADDR* lpSockAddr, int* lpSockAddrLen, int nFlags = 0 );

 
你最好在哪个record中加packet,原因那个帖子说了。另外如果你发送的是整个报文结构
为什么content.size是512呢?应该是516才对呀。
 
我让他试了下好象还是不对
我快被它搞崩溃了,什么破玩意呀,哎!受不了!

TO:zw84611,谢谢你呀,真的很谢谢你,我看能不能想其他的什么办法,大不了,把服务端
改到DELPHI里来写总成了吧。以后还要请教你呀。如果你有什么新的发现给我说一下有啊!
cjsam@sina.com
 
TO:zw84611;我发现了一点不知道是不是这里的原因。
定义个结构:
Type
TDataFormat=packed record
a:Byte;
b:Byte;
c:array[0..1] of byte;
d:array [0..512] of char;
end;
然后开始:
var
tmp:TDataFormat;
tmp1:TMemoryStream;
str:string;
i:integer;
begin
str:='abcdefghdsddddddddddddddddddddddddddddd';
with tmp do
begin
a:=$30;
b:=1;
c[0]:=0;
c[1]:=Length(str);
for i:=0 to 10 do
Stream:=(str[i+1]);
end;
str:=inttostr(tmp.Head)+inttostr(tmp.SerNumber)+tmp.stream;
tmp1:=TMemoryStream.Create;
//*******************************************//
tmp1.WriteBuffer(tmp,sizeof(tmp)) ;
//*******************************************//
FSockAddrIn.SIn_Addr.S_addr := inet_addr(PChar('172.18.16.1')); ;
FSockAddrIn.SIn_Port := htons(strtoint('8888'));
sendto(sock, tmp1.memory^, tmp1.Size, 0, FSockAddrIn, sizeof(FSockAddrIn));
tmp1.Free;
end;
当我运行后,在服务端获得我发出去的包没有IP/PORT。
但是我改成这样不发送结构,发送一个字符串就没问题(而且不管多长,当然了不能朝过STRING的长度)。

tmp1:=TMemoryStream.Create;
//*******************************************//
tmp1.Write(str[1],sizeof(str)) ;
//*******************************************//
FSockAddrIn.SIn_Addr.S_addr := inet_addr(PChar('172.18.16.1')); ;
FSockAddrIn.SIn_Port := htons(strtoint('8888'));
sendto(sock, tmp1.memory^, tmp1.Size, 0, FSockAddrIn, sizeof(FSockAddrIn));
是不是关于流在写入一个结构的时候的问题呀,
 
看一下下面这样行不行。

Type
pData= ^TDataFormat;
TDataFormat=packed record
a:Byte;
b:Byte;
c:array[0..1] of byte;
d:array [0..511] of char;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
buf: ^byte;
pd: pData;
begin
GetMem(buf,sizeof(TDataFormat));
pd := pData(buf);
pd.a := $a;
pd.b := $b;
FillChar(pd.d,512,'a');
...
SendTo(sock,buf^,sizeof(TDataFormat),...)
....
FreeMemory(buf);
end;
 
一样,没反映
 
这样呢?

Type
pData= ^TDataFormat;
TDataFormat=packed record
a:Byte;
b:Byte;
c:array[0..1] of byte;
d:array [0..511] of char;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
buf: ^char;
pd: pData;
begin
GetMem(buf,sizeof(TDataFormat));
pd := pData(buf);
pd.a := byte('a');
pd.b := byte('b');
FillChar(pd.d,512,'a');
SendTo(sock,buf^,sizeof(TDataFormat),...)
FreeMemory(buf);
end;
 
或者试试这样,我下午有事,先走了。

Type
pData= ^TDataFormat;
TDataFormat=packed record
a:Byte;
b:Byte;
c:array[0..1] of byte;
d:array [0..511] of char;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
buf: array[0..515]of char;
pd: pData;
begin

pd := pData(@buf[0]);
pd.a := byte('a');
pd.b := byte('b');
pd.c[0] := byte('c');
pd.c[1] := byte('d');
FillChar(pd.d,512,'a');
SendTo(sock,buf,sizeof(TDataFormat),...)
end;
 
我终于搞定了。我知道是什么原应了,我定义的一个结构传过去,但是VC里收的必须也要是
定义一个结构才能收的到。
 
faint..., 这和结构有关系吗?并且他本来就应该有定义了和你一样的报文结构呀。
那他如果定义UDP_LEN=516,是否就能收到?
 
不行,他必须的定义和我一样的,他定义一个大的树组都不行。
本来是他定义的一个大的数组,收了后按协议结构解析,但是不行,不然收到的没IP/PORT
简直太奇怪了。
 
那如果是两边都是VC的程序或两边都是Delphi的程序,也会这样吗?
 
接受答案了.
 
后退
顶部