Network programming 如何在Lazarus中将psockaddr转换为sockaddr_?

Network programming 如何在Lazarus中将psockaddr转换为sockaddr_?,network-programming,lazarus,winsock2,Network Programming,Lazarus,Winsock2,一、 我正在lazarus中使用winsock2创建服务器/客户端聊天应用程序。我无法从连接的用户获取ip地址。我的代码如下所示: uses winsock2,windows; var wsa : twsadata; main_sock,client_sock : tsocket; server : sockaddr_in; client : psockaddr; c : integer; begin wsastartup(makeword(2,2),wsa); ma

一、 我正在lazarus中使用winsock2创建服务器/客户端聊天应用程序。我无法从连接的用户获取ip地址。我的代码如下所示:

uses winsock2,windows;
var
  wsa : twsadata;
  main_sock,client_sock : tsocket;
  server : sockaddr_in;
  client : psockaddr;
  c : integer;
begin
  wsastartup(makeword(2,2),wsa);
  main_sock := socket(AF_INET,SOCK_STREAM,0);
  server.sin_family:=AF_INET;
  server.sin_addr.s_addr:=inet_addr('192.168.0.101');
  server.sin_port:=htons(8888);
  bind(main_sock,server,sizeof(server));
  listen(main_sock,3);
  while true do
  begin
    c:=sizeof(sockaddr_in);
    client_sock:=accept(main_sock,client,c);
    if (client_sock <> invalid_socket) then
    begin
      writeln('Connection accepted with these properties : ','??????');
      send(client_sock,'Hello',10,0); //just to make sure.
    end;
  end;
end.
使用winsock2、windows;
变量
wsa:twsadata;
主插座、客户插座:tsocket;
服务器:sockaddr_in;
客户:psockaddr;
c:整数;
开始
wsastartup(makeword(2,2),wsa);
main\u sock:=套接字(AF\u INET,sock\u STREAM,0);
server.sinu family:=AF\u INET;
server.sin_addr.s_addr:=inet_addr('192.168.0.101');
server.sinu端口:=htons(8888);
绑定(main_sock,server,sizeof(server));
听(主音,3);
尽管如此
开始
c:=sizeof(sockaddr_in);
client_sock:=接受(main_sock,client,c);
如果(客户端\u套接字无效\u套接字),则
开始
writeln('接受与这些属性的连接:','?');
发送(client_sock,'Hello',10,0)//只是为了确定一下。
结束;
结束;
结束。
我知道用户ip地址存储在客户端(psockaddr)中,但我不知道如何取出。如果在结构上是sockaddr_,我可以这样做。
提前谢谢

psockaddr
是一种指针类型,但是
accept()
不分配内存,并且您的
客户端
变量没有指向任何对象。您需要在中将
客户端
变量更改为
sockaddr\u,并使用
@
运算符将其传递给
accept()

var
  ...
  client : sockaddr_in;
  c : integer;
begin
  ...
  while true do
  begin
    c:=sizeof(client);
    client_sock:=accept(main_sock,psockaddr(@client),c);
    ...
  end;
end.

psockaddr
是一种指针类型,但是
accept()
不分配内存,并且您的
客户端
变量没有指向任何对象。您需要在
中将
客户端
变量更改为
sockaddr\u,并使用
@
运算符将其传递给
accept()

var
  ...
  client : sockaddr_in;
  c : integer;
begin
  ...
  while true do
  begin
    c:=sizeof(client);
    client_sock:=accept(main_sock,psockaddr(@client),c);
    ...
  end;
end.