【问题标题】:How to convert psockaddr to sockaddr_in Lazarus?如何将 psockaddr 转换为 sockaddr_in Lazarus?
【发布时间】:2016-01-10 16:22:40
【问题描述】:

我正在使用 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 地址存储在 client(psockaddr) 中,但我不知道如何取出它们。如果它是 sockaddr_in 结构,我可以做到。 提前致谢。

【问题讨论】:

    标签: network-programming lazarus winsock2


    【解决方案1】:

    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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 2011-07-23
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 2012-07-25
      相关资源
      最近更新 更多