如何将 psockaddr 转换为 sockaddr_in Lazarus?
How to convert psockaddr to sockaddr_in Lazarus?
我正在 lazarus.I 中使用 winsock2 创建一个 server/client 聊天应用程序,但无法从已连接的 user.My 代码中获取 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) 中,但我不知道如何获取它们 out.I 如果它是 sockaddr_in 结构就可以做到。
提前致谢。
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.
我正在 lazarus.I 中使用 winsock2 创建一个 server/client 聊天应用程序,但无法从已连接的 user.My 代码中获取 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) 中,但我不知道如何获取它们 out.I 如果它是 sockaddr_in 结构就可以做到。 提前致谢。
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.