- •Список вопросов на экзамен
- •Часть 1. Сети. 3
- •Часть 2. Сокеты. 26
- •Часть 1. Сети.
- •Классификация ip-адресов. Понятие номера сети и номера узла.
- •255.255.255.0 - Маска для сети класса с.
- •1.2. Модель osi. Физический уровень.
- •1.3. Модель osi. Канальный уровень.
- •1.4. Модель osi. Сетевой уровень.
- •1.5. Модель osi. Транспортный уровень.
- •1.6. Модель osi. Сеансовый уровень.
- •1.7. Модель osi. Уровень представления.
- •1.8. Модель osi. Прикладной уровень.
- •1.9. Адресация в ip-сетях.
- •1.10. Протоколы arp и rarp. Их место в стеке протоколов ip.
- •1.11. Маршрутизация в ip-сетях.
- •1.12. Структуризация ip-сетей с помощью масок.
- •255.255.255.0 - Маска для сети класса с.
- •1.13. Протокол tcp. Его место в стеке протоколов tcp/ip.
- •1.14. Протокол udp. Его место в стеке протоколов tcp/ip.
- •1.15. Протоколы надёжной доставки пакетов. Концепция квитирования.
- •1.16. Маршрутизаторы. Их место в сетевой модели osi.
- •1.17. Понятие маршрута. Принципы построения таблиц маршрутизации.
- •1.18. Понятие топологии сети. Средства объединения сетей с произвольной топологией.
- •1.19. Понятие стека сетевых протоколов. Стек протоколов tcp/ip.
- •1.20. Понятие сетевого интерфейса. Модель сетевого интерфейса для ip-сети.
- •Часть 2. Сокеты.
- •2.1. Технология клиент-сервер.
- •2.2. Событийная модель соединения сокетов.
- •2.3. Особенности программирования сетевого приложения.
- •2.4. Этапы организации соединения сокетов.
- •2.5. Организация сетевого соединения со стороны клиента.
- •2.10. Сокеты, как средство межпрограммного взаимодействия.
- •2.11. Сокеты. Их место в сетевой модели osi.
- •2.12. Сокеты. Их место в стеке протоколов ip.
- •2.13. Сокеты в ос Windows. Технология Windows Sockets.
- •2.14. Средства библиотеки mfc для работы с сокетами.
- •2.16. Передача данных через сокет.
- •2.17. Приём данных через сокет.
- •2.18. Способы закрытия сетевого соединения между сокетами.
- •2.19. Типы сокетов. Область их применения.
- •2.20. Понятие номера порта для протоколов транспортного уровня сетевой модели osi.
2.16. Передача данных через сокет.
// функция реакции на возможность передачи
void CProtocol::OnSend(int ErrCode)
{
CAsyncSocket::OnSend(ErrCode);
m_SendDataSize = 0;
while (m_SendDataSize < m_SendMemory.GetSize()) // пока есть данные для отправки
{
int n = Send(((BYTE*)m_SendMemory.GetAddr() + m_SendDataSize), m_SendMemory.GetSize()-m_SendDataSize); // запись в буфер сетевухи
// Анализ ошибок
if (n == SOCKET_ERROR)
{
ErrCode = GetLastError();
if (ErrCode != WSAEWOULDBLOCK)
{
CString s;
s.Format("Ошибка при передаче! Код ошибки %u", ErrCode);
MessageBox(0,s,"Сообщение",MB_OK);
Close();
}
}
else m_SendDataSize+= n;
}
m_SendMemory.Alloc(0);
m_SendDataSize = 0;
}
// функция посылки данных
void CProtocol::SendPacket(const void* p, DWORD size)
{
m_SendMemory.AddToMemory(&size, sizeof(DWORD)); // добавление размера данных
m_SendMemory.AddToMemory((BYTE*)p, size); // и свмих данных
OnSend(0);
}
2.17. Приём данных через сокет.
// получение данных
void CProtocol::OnReceive(int ErrCode)
{
CAsyncSocket::OnReceive(ErrCode);
if (m_IsReceiveSize) // Прием размера данных
{
int n = Receive((BYTE*)&m_ReceiveSize+m_ReceiveDataSize, sizeof(DWORD)-m_ReceiveDataSize);
// Анализ ошибок
if (n == SOCKET_ERROR)
{
ErrCode = GetLastError();
if (ErrCode != WSAEWOULDBLOCK)
{
CString s;
s.Format("Ошибка при приеме длины! Код ошибки %u", ErrCode);
MessageBox(0,s,"Сообщение",MB_OK);
Close();
}
}
else
// Анализ принятых данных
{
m_ReceiveDataSize+= n;
if (m_ReceiveDataSize == sizeof(DWORD)) // при приеме длины полностью
{
m_IsReceiveSize = false;
m_ReceiveData.Alloc(m_ReceiveSize);
m_ReceiveDataSize = 0;
}
}
}
else
// Прием самих данных
{
int n = Receive((BYTE*)m_ReceiveData.GetAddr()+m_ReceiveDataSize, m_ReceiveSize-m_ReceiveDataSize);
// Анализ ошибок
if (n == SOCKET_ERROR)
{
ErrCode = GetLastError();
if (ErrCode != WSAEWOULDBLOCK)
{
CString s;
s.Format("Ошибка при приеме собщения! Код ошибки %u", ErrCode);
MessageBox(0,s,"Сообщение",MB_OK);
Close();
}
}
else
// Анализ принятых данных
{
m_ReceiveDataSize+= n;
if (m_ReceiveDataSize == m_ReceiveSize) // при завершении приема пакета
{
m_ReceiveDataSize = 0;
m_IsReceiveSize = true;
//AfxMessageBox("Принят пакет!");
OnReceivePacket();
}
}
}
}
2.18. Способы закрытия сетевого соединения между сокетами.
Как оказалось, их 3:
Соединение разрывается по инициативе самого сокета; Функция Close();
Соединение разрывается при получении команды от удаленного сокета о разрыве соединения; Событие OnClose();
Соединение разрывается при обрыве линии связи.
2.19. Типы сокетов. Область их применения.
Сокетом (от англ. socket - гнездо, розетка) называется специальный объект, создаваемый для отправки и получения данных через сеть. Этот объект создаётся внутри библиотеки сокетов, а программист, использующий эту библиотеку, получает уникальный номер (дескриптор) этого сокета. Конкретное значение этого дескриптора не несёт для программиста никакой полезной информации и может быть использовано только для того, чтобы при вызове функции из библиотеки сокетов указать, с каким сокетом требуется выполнить операцию.
Чтобы две программы могли общаться друг с другом через сеть, каждая из них должна создать сокет. Каждый сокет обладает двумя основными характеристиками: протоколом и адресом, к которым он привязан. Протокол задаётся при создании сокета и не может быть изменён впоследствии. Адрес сокета задаётся позже, но обязательно до того, как через сокет пойдут данные. В некоторых случаях привязка сокета к адресу может быть неявной.
После организации соединения сокетов любое чтение или запись через файловый дескриптор одного из них будут на самом деле передавать данные между ним и парным ему сокетом другого приложения.
Сокеты, независимо от вида, деляться на три типа: потоковые, сырые(windows их не "держит") и дейтаграммные. Потоковые сокеты работают с установкой соединения, обеспечивая надежную идентификацию обеих сторон и гарантируют целостность и успешность доставки данных, опираются на протокол TCP. Дейтаграммные сокеты работают без установки соединения и не обеспечивают ни идентификации отправителя, ни контроля успешности доставки данных, зато они быстрее потоковых, опираються на протокол UDP. Сырые сокеты, они предоставляют возможность ручного формирования TCP\IP пакетов.
Источник:
http://tehnofil.ru/?id=91