Сокеты 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 |
Где nPort — номер порта. Дополнительные сведения о портах см. в разделах Сокеты Windows: порты и адреса сокетов .
Сервер всегда должен указывать порт, чтобы клиенты могли подключаться. Иногда
Create
вызов также задает адрес. На стороне клиента используйте параметры по умолчанию, которые просят MFC использовать любой доступный порт.Где nPort — номер порта и strAddr — это адрес компьютера или IP-адрес.
Адреса компьютера могут принимать несколько форм: "ftp.microsoft.com", "microsoft.com". IP-адреса используют форму "пунктирное число" "127.54.67.32".
Connect
Функция проверка, чтобы узнать, является ли адрес пунктирной цифрой (хотя он не проверка, чтобы убедиться, что номер является допустимым компьютером в сети).Connect
В противном случае предполагается имя компьютера одной из других форм.При вызове
Accept
на стороне сервера вы передаете ссылку на новый объект сокета. Сначала необходимо создать этот объект, но не вызыватьCreate
его. Помните, что если этот объект сокета выходит из область, соединение закрывается. MFC подключает новый объект к дескриптору SOCKET . Вы можете создать сокет на стеке, как показано ниже, или в куче.Архив и файл сокета закрываются при выходе из область. Деструктор объекта сокета также вызывает функцию Close-члена для объекта сокета, когда объект выходит из область или удаляется.
Дополнительные заметки о последовательности
Последовательность вызовов, показанных в предыдущей таблице, предназначена для сокета потока. Сокеты диаграммы данных, которые являются бессерверными, не требуют CAsyncSocket::Подключение, прослушивания и приема вызовов (хотя при необходимости можно использоватьConnect
). Вместо этого, если используется класс CAsyncSocket
, сокеты диаграммы данных используют CAsyncSocket::SendTo
функции-члены и ReceiveFrom
функции-члены. (При использовании сокета диаграммы данных используется Connect
Send
и Receive
.) Так как CArchive
не работает с диаграммами данных, не используйте CSocket
архив, если сокет является набором данных.
CSocketFile не поддерживает все CFile
функции; CFile
такие члены, как Seek
, которые не имеют смысла для связи сокета, недоступны. Из-за этого некоторые функции MFC Serialize
по умолчанию несовместимы с CSocketFile
. Это особенно верно для CEditView
класса. Не следует пытаться сериализовать CEditView
данные с помощью объекта, присоединенного CSocketFile
CArchive
к объекту; CEditView::SerializeRaw
использовать CEditView::Serialize
вместо этого (не документирован). Функция SerializeRaw ожидает, что объект файла имеет такие функции, как Seek
, которые CSocketFile
не поддерживаются.
Дополнительные сведения см. в разделе:
См. также
Сокеты Windows в MFC
Класс CSocket
CAsyncSocket::Create
CAsyncSocket::Close