Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_m1 / lab_m1.doc
Скачиваний:
67
Добавлен:
07.02.2016
Размер:
2.69 Mб
Скачать

4.7.5 Підключення до сервера

Клієнт для з'єднання із сервером повинен використати функцію connect:

int connect(SOCKET s, const struct socketaddr FAR* name, int namelen);

де s - дескриптор сокета;

name - ідентифікатор адреси місця призначення (покажчик на структуру даних);

namelen - довжина цієї адреси.

Таким чином, функція connect повідомляє IP-адресу й номер порту віддаленій машині. Якщо адресне поле структури name містить нулі, функція connect поверне помилку WSAEADDRNOTAVAIL (або SOCKE T_ERROR=-1). Спроба підключення до сервера описана в наступному прикладі:

Var

ClientSocket : TSocket; ServerAddr : SockAddrIn; ErrConnect : integer;

begin

ServerAddr.sinfamily := AFINET;

ServerAddr.sin_port := htons(1024);

ServerAddr.sin_addr.s_addr := inetaddr(<IP-адреса сервера>);

ErrConnect := connect(ClientSocket, ServerAddr, SizeOf(ServerAddr));

If (ErrConnect <> 0) then

ShowMessage('Не можу підключитися до сервера')

Else

// Ваші подальші дії

end.

4.7.6 Відправлення й прийом повідомлень

Для відправлення повідомлень використовується функція send або sendto:

int send (SOCKET s, const char FAR* buf, int len, intflags),

де s - дескриптор сокета на вилученій машині;

buf - покажчик на масив символів, що підлягають пересиланню;

len - розмір другого параметра;

flgas - служить для цілей діагностики й керування передачею даних. Рекомендується прирівнювати його нулю.

Приклад розсилання повідомлень оператором send:

Var

Buf : array [0..255] of char; ErrSend : integer;

Begin

ErrSend := send(AcceptSocket, Buf, SizeOf(Buf), 0);

If (ErrSend = SOCKETERROR) then ShowMessage('Помилка передачі даних')

Else

// Ваші подальші дії

End.

Функція sendto служить для пересилання даних без установки з'єднання, тобто відправлення даних іде без підтвердження одержання даних:

int sendto (SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr FAR* to, int tolen);

де s - дескриптор відправника;

buf - покажчик на масив даних, призначених для пересиланню; len - розмір другого параметра;

flags - служить для цілей діагностики й керування передачею даних;

to - адресна структура сокета вилученої машини;

tolen - розмір адресної структури сокета вилученої машини.

Приклад посилки повідомлень функцією sendto:

Var

Buf : array [0..255] of char;

MySocket : TSocket; SendToAddr : SockAddrIn; ErrSendTo : ineteger;

Begin

ErrSenTo := sendto(MySocket, Buf, SizeOf(Buf), 0, SendToAddr, SizeOf(SendToAddr));

If (ErrSendTo = SOCKETERROR) then

ShowMessage('Помилка передачі даних')

Else

// Ваші подальші дії

End.

Для прийому повідомленнь застосовується функція recv або recvfrom. Функцію recvfrom так само, як і sendto, можна застосовувати, не з'єднуючись із відправником.

int recv (SOCKET s, char FAR* buf, int len, int flags);

де s - дескриптор сокета одержувача;

buf - покажчик на масив отриманих даних;

len - розмір другого параметра;

flags - служить для цілей діагностики й керування передачею даних.

Приклад прийому повідомлень функцією recv:

Var

Buf : array [0..255] of char; MySock : TSocket; ErrRecv : integer;

Begin

ErrRecv := recv(MySock, buf, SizeOf(Buf), 0);

If (ErrRecv = SOCKETERROR) then

ShowMessage^ можу прийняти повідомлення')

Else

// Ваші подальші дії

End.

int recvfrom (SOCKET s, const char FAR* buf, int len, int flags, const struct sockaddr FAR* to, int tolen);

де s - дескриптор одержувача;

buf - покажчик на масив отриманих даних;

len - розмір другого параметра;

flags - служить для цілей діагностики й керування передачею даних;

to - адресна структура сокета віддаленої машини;

tolen - розмір адресної структури сокета віддаленої машини.

Приклад прийом повідомлень, використовуючи функцію recvfrom:

Var

Buf : array [0..255] of char;

MySocket : TSocket;

RecvFromAddr : SockAddrIn;

ErrRecvFrom : ineteger;

Begin

ErrRecvFrom := recvfrom(MySocket, Buf, SizeOf(Buf), 0, RecvFromAddr, SizeOf(RecvFromAddr));

If (ErrRecvFrom = SOCKETERROR) then

ShowMessage('Не можу прийняти повідомлення')

Else

// Ваші подальші дії

End.