//Перетворимо номер порту 80 в мережевій порядок байтів .sin_port=htons (80);
/* inet_addr перетворить рядок з IP адресою в long значення,
яке є IP адресою в мережевому порядку байтов._addr.S_un.S_addr визначає long значення в адресному об'єднанні */
sockAddr1.sin_addr.S_un.S_addr=inet_addr ( 127.0.0.1 );
//Встановлюємо адреса sockAddr2, встановлюючи значення кожної з 4 байтовой частини:
sockAddr2.sin_addr.S_un.S_un_b.s_b1=127; .sin_addr.S_un.S_un_b.s_b2=0; .sin_addr.S_un.S_un_b.s_b3=0;
sockAddr2.sin_addr.S_un.S_un_b.s_b4=1;
Функція inet_addr, у вищенаведеному прикладі, перетворює строкове значення IP адреси (записаного в «точковому» форматі) у відповідне 32-бітове значення в мережевому порядку байтів. Також існує функція inet_ntoa, яка робить теж саме, тільки навпаки.
connectconnect (SOCKET s, const struct sockaddr * name, int namelen);
Функція connect з'єднають socket з віддаленим socketом. Ця функція використовується на клієнтській стороні підключення, тому саме клієнт є ініціатором підключення.
Короткий опис параметрів цієї функції: - непідключений socket, який ти хотів би подключіть.- покажчик на структуру sockaddr, в якій міститься ім'я (адреса) віддаленого socketа, до якого необхідно подключітся.- розмір структури, в якій міститься ім'я.
Перший параметр - це клієнтський socket, що використовує з'єднання, наприклад, щойно створений socket за допомогою функції socket (). Решта два параметри, name і namelen, використовуються для адресації віддаленого socketа (socket сервера, який знаходиться в режимі прослуховування).
Цю функцію застосовують для з'єднання з сервером. Щоб звернутися до сервера, ти можеш використовувати структуру sockaddr_in, заповнивши її IP адресою і номером порту сервера. Ти можеш поцікавитися, як отримати IP адреса сервера, наприклад, vr-online lt; # justify gt; II Практична частина
. 1 Опис і лістинг програми Server Socket
# include lt; iostream gt;
# include lt; windows.h gt;
# pragma comment (lib, ws2_32.lib )//підключення бібліотеки winsock2main (void) {namespace std; PCName [30], ClientName [30], Message [200]; WSADat;// Властивості WinSock (результат функції WSAStartup)
sockaddr_in sin;// Властивості (адреса) створюваного сокетаSock, Client;// Серверний і клієнтський сокети (0x0202, amp; WSADat);// Ініціалізація WinSock
//0x0202 - версія WinSock. Може бути 1.0, 1.1, 2.0, 2.2
//WSADat - структура, куди будуть занесені рез. ініціалізації (PCName, 30);// Отримання імені поточного ПК
sin.sin_family=AF_INET;// Тип адреси
sin.sin_addr.s_addr=0;// IP-адресу сервера (порист створенні сервера можна 0) .sin_port=htons (2803);// Номер порту сервера
Sock=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);// Створення сокета
bind (Sock, (sockaddr *) amp; sin, sizeof (sin));// Зв'язування створеного сокета з адресою sin
Рис.3
//***** Очікування клієнта lt; lt; Wait of client ... lt; lt; endl;
listen (Sock, SOMAXCONN);// Прослуховування сокета сервером (для підключення клієнта)
Client=accept (Sock, (sockaddr *) amp; sin, 0);// Очікування клієнта
recv (Client, ClientName, 30, 0);// Отримання імені комп'ютера клієнта (Client, PCName, strlen (PCName) + 1, 0);// Відправка імені цього комп'ютера (сервера)
Рис.4 lt; lt; Client ( lt; lt; ClientName lt; lt; ) has connected! lt; lt; endl;
//***** МенюMenu; { lt; lt; 1. Send message; lt; lt; endl; lt; lt; 2. Get Message; lt; lt; endl; lt; lt; 3. Quit; lt; lt; endl; lt; lt; Make your selection: raquo ;; cin gt; gt; Menu;
switch (Menu) {1:
Рис.4
//Відправка повідомлення клієнту
cout lt; lt; Enter message: raquo ;; cin.get () ;. getline (Message, 200); (send (Client, Message, strlen (Message) + 1, 0)!=SOCKET_ERROR) cout lt; lt; Sent! n raquo ;; cout lt; lt; Error of sending! n raquo ;;
break; 2:
Рис.5
//Прийом повідомлення від клієнта (recv (Client, Message, 200, 0)!=SOCKET_ERROR) { lt; lt; Message lt; lt; endl; .get ();
} cout lt; lt; Error of getting! n raquo ;;;
};
lt; lt; endl;
} while (Menu!=3);
//Закриття сокетів і закінчення ...