2016-01-10 3 views
1

я создаю приложение чата клиента/сервера с Winsock2 в lazarus.I есть проблемы, чтобы получить IP-адрес от подключенного кода user.My выглядит следующим образом:Как преобразовать psockaddr в sockaddr_in Lazarus?

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. Спасибо заранее.

ответ

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. 
+0

Отлично! Это сработало. – Ramtin