recvfrom函数中(如何传输参数PSockAddrIn) ( 积分: 100 )

  • 主题发起人 主题发起人 ddzhouqian
  • 开始时间 开始时间
D

ddzhouqian

Unregistered / Unconfirmed
GUEST, unregistred user!
通信的个DEMO,没看懂,recvfrom中的PSockAddrIn的参数,用了个地址传输,我在想这个地址是什么地址?为什么通过该地址可以取到通信的数据?可能问的太菜了,请大家见谅!呵呵
var
addr: TSockAddrIn;
addrTo: TSockAddrIn;
addrlen,addrTolen: Integer;
begin
addrlen:=sizeof(addr);
addrTolen:=sizeof(addrTo);
recvfrom(sock,buffer,1500,0,@addr,addrlen);
end;
 
这个地址是数据发送方的地址,并非通过该地址取得通信的数据,而是接收数据后,顺便取得对方的地址,也就是说,这个参数是输出参数(out),调用时不必初始化.
简单范例如下:
var
socket:TSocket;
addr: TSockAddrIn;
addrlen: Integer;
buf:string;
retValue:Integer;
begin
socket:=Winsock.socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if socket<>INVALID_SOCKET then
try
addrlen:=SizeOf(addr);
FillChar(addr,addrlen,0);
addr.sin_family:=AF_INET;
addr.sin_port:=htons(8888);
addr.sin_addr.S_addr:=htonl(INADDR_ANY);
bind(socket,addr,addrlen);
SetLength(buf,255);
retValue:=recvfrom(socket,buf[1],255,0,addr,addrlen);
if retValue=SOCKET_ERROR then
begin
RaiseLastOSError;
end else
begin
SetLength(buf,retValue);
ShowMessage(Format('发送方的地址为:%s,端口为%d',[inet_ntoa(addr.sin_addr),ntohs(addr.sin_port)]));
ShowMessage(Format('接收到的数据为:%s',[buf]));
end;
finally
closesocket(socket);
end;
end;
 
我明白楼上的意思,通过addr记录类可以从中取到与发送端相关的信息。
我要问的是我仅仅定义了个TSockAddrIn记录的变量addr,那么我通过recvfrom函数后怎么就能取到该记录的相关信息的?是如何让这个指针指向这个记录的?
 
如果addr为指针,则参数写成addr^即可
var
socket:TSocket;
addr: PSockAddrIn;
addrlen: Integer;
buf:string;
retValue:Integer;
begin
socket:=Winsock.socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if socket<>INVALID_SOCKET then
try
New(addr);
addrlen:=SizeOf(TSockAddrIn);
FillChar(addr^,addrlen,0);
addr^.sin_family:=AF_INET;
addr^.sin_port:=htons(8888);
addr^.sin_addr.S_addr:=htonl(INADDR_ANY);
bind(socket,addr^,addrlen);
SetLength(buf,255);
retValue:=recvfrom(socket,buf[1],255,0,addr^,addrlen);
if retValue=SOCKET_ERROR then
begin
RaiseLastOSError;
end else
begin
SetLength(buf,retValue);
ShowMessage(Format('发送方的地址为:%s,端口为%d',[inet_ntoa(addr.sin_addr),ntohs(addr.sin_port)]));
ShowMessage(Format('接收到的数据为:%s',[buf]));
end;
finally
closesocket(socket);
end;
end;
 

Similar threads

后退
顶部