谁能给我贴一段直接用API写的UDP通讯的代码?(50分)

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

cjsam

Unregistered / Unconfirmed
GUEST, unregistred user!
好象用控件通讯老是有问题。谢谢了!
 
我写了一个,源程序在:http://www.playicq.com/dispdoc.php?t=&id=434
 
to:zw84611

问个问题,关于你程序中的问题,不知道是什么原因。
你的程序你发送数据的函数:senddata
procedure SendData(content: TMemoryStream);
var
len:integer;
begin
FSockAddrIn.SIn_Addr.S_addr := inet_addr(PChar(Hostname));
FSockAddrIn.SIn_Port := htons(strtoint(port));
len := sendto(sock, content, sizeof(content), 0, FSockAddrIn, sizeof(FSockAddrIn));
if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then
begin
MessageBox(handle,'SOCKET错误,代码:','提示',mb_ok);
WriteLog(now,'SOCKET错误,代码:'+inttostr(WSAGetLastError()));
exit;
end;
if len = SOCKET_ERROR then
begin
MessageBox(handle,'数据发送失败!','提示',mb_ok);
WriteLog(now,'数据发送失败!');
exit;
end;
if len<>sizeof(content) then
begin
MessageBox(handle,'数据发送不完整!','提示',mb_ok);
end;
end;
我直接把哪个参数由STRING 改成了TMemoryStream后,发送出去,服务端能收到包
但是数据是错误的,请问这样改行不行,因为待发送数据我采用的是流存储。不行的该
怎样实现,谢谢,完后我一并给分,我没多少分了,不好意思。
 
用流当然可以,其实是发送二进制数据。把你的代码全部贴出来。
 
好,看看了,谢谢:
Type
TCommDataFormat=packed record
Head:Byte;
SerNumber:Byte;
StreamLen:array[0..1] of byte;
stream:array [0..512] of char;
end;

procedure TLogin_frm.BitBtn1Click(Sender: TObject);
var
MyStream: TMemoryStream;
Str:string;
TmpStr:TCommDataFormat;
buffer:char;
m,i,j:integer;
begin
str:=Login_name.text;
for m:=1 to 10-Length(str) do
str:='0'+str;//STR补足共10个CHAR
str:=str+Login_pw.text;
m:=length(str);
with TmpStr do
begin
Head:=$10;
SerNumber:=1;
streamlen[0]:=0;
StreamLen[1]:=Length(str);
for i:=0 to m-1 do
Stream:=(str[i+1]);
end;//给第一次通讯的包写数据,以16为命令头。
WriteLog(now,'用户号码为:'+Login_name.text+'发送登陆密码校验!');
MyStream:=TMemoryStream.Create;
try
MyStream.Write(TmpStr, sizeof(TCommDataFormat));
senddata(Mystream);//为后面定义的函数。
IfSend:=True;
finally
MyStream.Free;
end;
end;

procedure SendData(content: TMemoryStream);
var
len:integer;
begin
FSockAddrIn.SIn_Addr.S_addr := inet_addr(PChar(Hostname));
FSockAddrIn.SIn_Port := htons(strtoint(port));
len := sendto(sock, content, sizeof(content), 0, FSockAddrIn, sizeof(FSockAddrIn));
if (WSAGetLastError() <> WSAEWOULDBLOCK) and (WSAGetLastError() <> 0) then
begin
MessageBox(handle,'SOCKET错误,代码:','提示',mb_ok);
WriteLog(now,'SOCKET错误,代码:'+inttostr(WSAGetLastError()));
exit;
end;
if len = SOCKET_ERROR then
begin
MessageBox(handle,'数据发送失败!','提示',mb_ok);
WriteLog(now,'数据发送失败!');
exit;
end;
if len<>sizeof(content) then
begin
MessageBox(handle,'数据发送不完整!','提示',mb_ok);
end;
end;
发送后收到的数据完全不正确。
 
我没有具体使用过TMemoryStream,你试一下:sendto(sock, content.Memory,...
 
我要去开会了,晚上再说。
 
就是你说的那样。只要把改成这样就OK了
sendto(sock, [red]content.memory^, content.size,[/red] 0, FSockAddrIn, sizeof(FSockAddrIn));
谢谢了,谢谢!
 
to :zw84611,

触发了收到数据的那个消息里面定义流你能看看有什么问题吗?我收到的全是空的。
procedure TLogin_frm.ReadData(var Message: TMessage);
var
len: integer;
flen: integer;
Event: word;
MyStream: TMemoryStream;
TmpStr:TCommDataFormat;
ordercode:integer;
begin
flen:=sizeof(FSockAddrIn);
FSockAddrIn.SIn_Port := htons(UDPPORT);
Event := WSAGetSelectEvent(Message.LParam);
if Event = FD_READ then
begin
MyStream := TMemoryStream.Create;
Mystream.Position:=0;
recvfrom(sock,Mystream.memory^,sizeof(Mystream),0,FSockAddrIn,flen);
end;
MyStream.Read(TmpStr,Mystream.Size);
ordercode:=TmpStr.Head;//显示定义的结构的头的内容。
end;
里面 TmpStr这个变量里面是空的,什么都收不到。

 
后退
顶部