Поделиться через


Сокеты Windows. Последовательность операций

В этой статье показано параллельное выполнение операций для сокета сервера и сокета клиента. Так как сокеты используют CArchive объекты, они обязательно являются сокетами потоков.

Последовательность операций для обмена данными сокета потока

До точки построения объекта следующая последовательность является точной CSocketFile (с несколькими различиями параметров) для обоих CAsyncSocket и CSocket. С этого момента последовательность строго для CSocket. В следующей таблице показана последовательность операций для настройки связи между клиентом и сервером.

Настройка связи между сервером и клиентом

Сервер клиент
// construct a socket

CSocket sockSrvr;
// construct a socket

CSocket sockClient;
// create the SOCKET

sockSrvr.Create(nPort);1,2
// create the SOCKET

sockClient.Create( );2
// start listening

sockSrvr.Listen( );
// seek a connection

sockClient.Connect(strAddr, nPort);3,4
// construct a new, empty socket

CSocket sockRecv;

// accept connection

sockSrvr.Accept( sockRecv ); 5
// construct file object

CSocketFile file(&sockRecv);
// construct file object

CSocketFile file(&sockClient);
// construct an archive

CArchive arIn(&file, CArchive::load);

или

CArchive arOut(&file, CArchive::store);

- или оба -
// construct an archive

CArchive arIn(&file, CArchive::load);

или

CArchive arOut(&file, CArchive::store);

- или оба -
// use the archive to pass data:

arIn >> dwValue;

или

arOut << dwValue;6
// use the archive to pass data:

arIn >> dwValue;

или

arOut << dwValue;6
  1. Где nPort — номер порта. Дополнительные сведения о портах см. в разделах Сокеты Windows: порты и адреса сокетов .

  2. Сервер всегда должен указывать порт, чтобы клиенты могли подключаться. Иногда Create вызов также задает адрес. На стороне клиента используйте параметры по умолчанию, которые просят MFC использовать любой доступный порт.

  3. Где nPort — номер порта и strAddr — это адрес компьютера или IP-адрес.

  4. Адреса компьютера могут принимать несколько форм: "ftp.microsoft.com", "microsoft.com". IP-адреса используют форму "пунктирное число" "127.54.67.32". Connect Функция проверка, чтобы узнать, является ли адрес пунктирной цифрой (хотя он не проверка, чтобы убедиться, что номер является допустимым компьютером в сети). Connect В противном случае предполагается имя компьютера одной из других форм.

  5. При вызове Accept на стороне сервера вы передаете ссылку на новый объект сокета. Сначала необходимо создать этот объект, но не вызывать Create его. Помните, что если этот объект сокета выходит из область, соединение закрывается. MFC подключает новый объект к дескриптору SOCKET . Вы можете создать сокет на стеке, как показано ниже, или в куче.

  6. Архив и файл сокета закрываются при выходе из область. Деструктор объекта сокета также вызывает функцию Close-члена для объекта сокета, когда объект выходит из область или удаляется.

Дополнительные заметки о последовательности

Последовательность вызовов, показанных в предыдущей таблице, предназначена для сокета потока. Сокеты диаграммы данных, которые являются бессерверными, не требуют CAsyncSocket::Подключение, прослушивания и приема вызовов (хотя при необходимости можно использоватьConnect). Вместо этого, если используется класс CAsyncSocket, сокеты диаграммы данных используют CAsyncSocket::SendTo функции-члены и ReceiveFrom функции-члены. (При использовании сокета диаграммы данных используется ConnectSend и Receive.) Так как CArchive не работает с диаграммами данных, не используйте CSocket архив, если сокет является набором данных.

CSocketFile не поддерживает все CFileфункции; CFile такие члены, как Seek, которые не имеют смысла для связи сокета, недоступны. Из-за этого некоторые функции MFC Serialize по умолчанию несовместимы с CSocketFile. Это особенно верно для CEditView класса. Не следует пытаться сериализовать CEditView данные с помощью объекта, присоединенного CSocketFileCArchive к объекту; CEditView::SerializeRawиспользовать CEditView::Serialize вместо этого (не документирован). Функция SerializeRaw ожидает, что объект файла имеет такие функции, как Seek, которые CSocketFile не поддерживаются.

Дополнительные сведения см. в разделе:

См. также

Сокеты Windows в MFC
Класс CSocket
CAsyncSocket::Create
CAsyncSocket::Close