Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_Ч1_2014_18.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
5 Мб
Скачать
☆

Создание клиентского приложения

Создайте клиентское приложение, имеющее вид, показанный на рис.3.

Клиентское приложение должно выполнять следующие действия:

  • Инициализировать интерфейс сокетов с помощью функции WSAStartup.

  • Создавать сокет с помощью функции socket.

  • Устанавливать соединение с сервером с помощью функции connect.

  • Передавать данные на сервер с помощью функции send.

  • Получать ответ от сервера в режиме эхо с помощью функции recv.

  • Выводить эхо-ответ на экран.

  • Закрывать сокет с помощью функции CloseSocket.

  • Прекратить работу с интерфейсом сокетов с помощью функции WSACleanup.

Для выполнения перечисленных функций выполните следующее:

  1. Создайте проект (New Application). Назовите созданный проект каким-либо именем, например – Client.

  2. На созданную форму перенесите две командные кнопки:

  3. Button1 - «Переслать сообщение»;

  4. Button2 - «Выход из программы».

  5. Для события OnClick командной кнопки «Переслать сообщение» запишите следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);

VAR

s:TSocket; {Сокет}

recipient,sender_socket:TSockAddr; {адреса сокета получателя и

сокета отправителя}

ret:Integer; {результат работы функций}

wsd:WSADATA; {Структура WSADATA, требуется для инициализации

интерфейса сокетов}

bufr:Array[0..90] of char; {буфер для передачи данных на сервер}

msgstring:Array[0..90] of char {буфер для вывода сообщения на экран};

bufs:Array [1..80] of char; {буфер для получения ответа от сервера}

size_socket:Integer; {размер структуры TSockAddr}

begin

// Инициализация интерфейса сокетов

If WSAStartup(MAKEWORD(2,2),wsd)<>0

then ShowMessageFmt('Ошибка %d при инициализации интерфеса сокетов',

[WSAGetLastError])

else

begin

// Создание сокета клиента

s:=socket(AF_INET,SOCK_STREAM,0);

If s=INVALID_SOCKET

then

ShowMessageFmt('Ошибка %d при создании сокета',[WSAGetLastError])

else

begin

// Формирование адреса сервера (получателя сообщения)

ZeroMemory(@recipient,sizeof(recipient));

recipient.sin_family:=AF_INET;

recipient.sin_port:=htons(2000);

recipient.sin_addr.S_addr:=inet_addr('192.168.0.2');

// Установление соединения

ret:=connect(s,recipient,sizeof(recipient));

If ret=SOCKET_ERROR then

ShowMessageFmt('Ошибка %d при установлении соединения ',

[WSAGetLastError])

else

begin

// Передаваемое сообщение

strcopy(@bufs,'Это мой тест');

// Передача сообщения серверу

ret:=send(s,bufs,sizeof(bufs),0);

If ret=SOCKET_ERROR then

ShowMessageFmt('Ошибка %d при передаче данных ',

[WSAGetLastError]);

ZeroMemory(@bufr,sizeof(bufr));

size_socket:=Sizeof(sender_socket);

// Получение ответа от сервера

ret:=recv(s,bufr,sizeof(bufr),0);

If ret=SOCKET_ERROR then

ShowMessageFmt('Ошибка %d при получении ответа ',

[WSAGetLastError])

else

begin

// Формирование сообщения msgstring для вывода на экран

StrCopy(@msgstring,'Получен ответ: ');

StrCat(@msgstring,@bufr);

StrCat(@msgstring,' от ');

StrCat(@msgstring,inet_ntoa(recipient.sin_addr));

ShowMessage(msgstring);

end;

end;

// закрытие сокета

CloseSocket(s);

end;

WSACleanup;

end;

end;

  1. Откомпилируйте созданное приложение.

  2. Проверьте совместную работу приложения-сервера и приложения-клиента.