Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2012, 22:33   #1
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию WinSock(клиент-сервер). Получение IP адресса клиента.

Необходимо написать программу клиент-сервер без использования готовых компонентов delphi. Написал некоторый код для сервера и клиента. Вроде бы соединение прохидит, но мне необходимо выяснить IP адресс клиента. Как можно это сделать? (Практически весь код взят из интернета, сам слабо разбираюсь в WinSock, поэтому код может выглядеть несовсем корректно. Если что не так, подскажите, буду стараться исправлять.)
Код:
 
// КОД ДЛЯ СЕРВЕРА
var Sock, Sock1: TSocket; Addr, client_add: sockaddr_in;  s:array of Char; i,j:LongInt; WSAData: TWSAData;
....
 if WSAStartup( $0101, WSAData )<> 0 then;
 Sock := Socket( PF_INET, SOCK_STREAM, IPPROTO_IP );
 if (Sock=INVALID_SOCKET) then  halt(2) ;
 with Addr do 
 begin
   sin_family := PF_INET; // тип то же что и у сокета
   sin_port := htons( 12345 ); // порт, htons обязательно !
   sin_addr.S_addr := INADDR_ANY; // для сервера
 end;
 Bind( Sock, Addr, SizeOf( Addr ) ); // "Биндим" сокет
 Listen( Sock, SOMAXCONN );// начинаем "слушать" (открываем порт)
 Sock1:=accept(Sock,@Client_add,nil);
 if Sock1<>-1 then
 mmo1.Lines.Add('подключился клиент');
//Следующие три строчки не работают
 if recv(Sock1,s,Length(s),0)<>-1 then
 ShowMessage(s[1]) else
 ShowMessage('беда');
.......
qwertyk вне форума Ответить с цитированием
Старый 24.06.2012, 00:47   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
i := sizeof(client_add);
Sock1 := accept(Sock, @client_add, @i);
client_add будет содержать адрес клиента
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 25.06.2012, 00:13   #3
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию

Спасибо разобрался! Теперь пишу функции приема и отправки сообщений.Дело в том,что с клиента сообщение отправляется нормально,а на сервере отображается закодированное сообщение(нечитаемые символы),как это исправить?
Клиент:
Код:
 var
      s:array of Char;
.........
function TForm1.SendString( S: String): Boolean;
  begin
      Result:=False;
    SetLength(s,Length(Edt1.Text));
    for i:=0 to Length(edt1.Text)   do
      s[i]:=edt1.text[i];
    if send(Sock,s,Length(edt1.Text),0)<>-1 then
        Result:=True;
  end;
..............
Сервер:
Код:
 var
   Sock1: TSocket;  s:array [0..100] of Char;
.......
begin
........
if recv(Sock1,s,Length(s),0)<>-1 then
     ShowMessage(s) else
     ShowMessage('Сообщение не дошло');
.......
end.

Последний раз редактировалось qwertyk; 25.06.2012 в 11:47.
qwertyk вне форума Ответить с цитированием
Старый 28.06.2012, 18:25   #4
qwertyk
Пользователь
 
Регистрация: 15.07.2009
Сообщений: 52
По умолчанию

Разобрался с нечитаемыми сиволами.При запуске сервера уставливается соединение,потом сервер виснет(при создании потока для каждого клиента с помощью функции BeginThread) и в это время никаких действий с ним нельзя произвести. Как эти проблемы исправить?
Сервер:
Код:
var
  Form1: TForm1; vSize:Integer;
  Sock,Sock1: TSocket;
  s1:array [0..100] of char;
  Addr, client_add: TSockAddr;
  s:array [0..100] of Char;
  i,j:LongInt;
  Handle:THandle;
  WSAData: TWSAData;
  Trid:LongWord;
  Bufsize:integer;
  vbuf:string;
implementation

{$R *.dfm}
procedure TForm1.SocketThread;
begin
  i := sizeof(client_add);
    Sock1:=accept(Sock,@Client_add,@i);
    if Sock1<>-1 then
    begin
      mmo1.Lines.Add('подключился клиент  '+ inet_ntoa(client_add.sin_addr));
      //setlength(s,bufsize);
    repeat
    vsize:=recv(Sock1,s,Length(s),0) ;
    if vsize<=0 then break;
    setlength(vbuf,vsize);
    lstrcpyn(@vbuf[1],@s[0],vsize);

                mmo1.Lines.Add('Сообщение '+vbuf);
                until s='exit';
                mmo1.Lines.Add('Клиент отключился');
    end ;
end;

procedure TForm1.serverClick(Sender: TObject);
begin
    if WSAStartup( $0101, WSAData )<> 0 then halt(1);
    Sock := Socket( PF_INET, SOCK_STREAM, IPPROTO_IP );
    if (Sock=INVALID_SOCKET) then  halt(2) ;
    with Addr do // начинаем заполнять структуру sockaddr_in
    begin
        sin_family := PF_INET; // тип то же что и у сокета
        sin_port := htons( 12345 ); // порт, htons обязательно !
        sin_addr.S_addr := INADDR_ANY; // для сервера
    end;
    Bind( Sock, Addr, SizeOf( Addr ) ); // "Биндим" сокет
    Listen( Sock, SOMAXCONN );// начинаем "слушать" (открываем порт)SOMAXCONN  максимально возможное количество соединений для данной системы.
    if BeginThread (nil,0,@TForm1.SocketThread,@sock1,0,Trid)<>0 then
    showmessage('yes')
    else
    showmessage('not');
       SocketThread;
      end;

procedure TForm1.Close_serverClick(Sender: TObject);
begin
      CloseSocket( Sock );
      WSACleanup;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
      mmo1.Clear;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
    StrPCopy(s1, edit1.Text);
       send(Sock,s1,Length(s),0) ;
       mmo1.Lines.Add(inet_ntoa(Addr.sin_addr)+' '+s1);
end;

Последний раз редактировалось qwertyk; 28.06.2012 в 18:44.
qwertyk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinSock. Клиент и сервер. _PROGRAMM_ Работа с сетью в Delphi 0 01.11.2011 18:40
Winsock - создание клиента _PROGRAMM_ Работа с сетью в Delphi 6 29.10.2011 17:28
Клиент-Сервер на WinSock Onekey Работа с сетью в Delphi 1 21.08.2010 14:41
Клиент-Сервер на WinSock Вишенка Работа с сетью в Delphi 3 24.02.2010 00:45
Получение адресса по имени процесса (Delphi) dyonysos Помощь студентам 5 14.09.2009 16:55