如何将psockaddr转换为sockaddr_in Lazarus?

时间:2016-01-10 16:22:40

标签: 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);
  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.

我知道用户的ip地址存储在客户端(psockaddr)但是我不知道怎么把它们取出来。如果它是sockaddr_in结构,我可以做到。 提前致谢。

1 个答案:

答案 0 :(得分:0)

psockaddr是指针类型,但accept()不分配内存,而client变量没有指向任何内容。您需要将client变量更改为sockaddr_in,并使用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.