Windows Sockets: Secuencia de operaciones
En este artículo se muestra, en paralelo, la secuencia de operaciones para un socket de servidor y un socket de cliente. Dado que los sockets utilizan objetos de CArchive , son necesariamente sockets de secuencia.
Secuencia de operaciones para una comunicación de socket de secuencia
Hasta el punto de construir un objeto de CSocketFile , la secuencia siguiente es exacta (con algunas diferencias de parámetro) para CAsyncSocket y CSocket. A partir de ese momento, la secuencia está estrictamente para CSocket. La tabla siguiente muestra la secuencia de operaciones para colocar la comunicación entre un cliente y un servidor.
Comunicación entre la creación un Servidor y un cliente
Servidor |
Cliente |
---|---|
// 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); O bien CArchive arOut(&file, CArchive::store); – ambos – |
// construct an archive CArchive arIn(&file, CArchive::load); O bien CArchive arOut(&file, CArchive::store); – ambos – |
// use the archive to pass data: arIn >> dwValue; O bien arOut << dwValue;6 |
// use the archive to pass data: arIn >> dwValue; O bien arOut << dwValue;6 |
1. Donde es un número de puerto nPort . Vea Windows Sockets: Puertos y direcciones de socket para obtener más información sobre puertos.
2. El servidor debe especificar siempre un puerto para que los clientes pueden conectarse. La llamada de crear a veces también especifica una dirección. En el cliente, utilice los parámetros predeterminados, que pide a MFC utiliza cualquier puerto disponible.
3. Donde es nPort un número de puerto y un strAddr es una dirección de equipo o dirección de (IP) de protocolo de Internet.
4. Las direcciones de equipo pueden tomar varios formularios: “ftp.microsoft.com”, “microsoft.com”. Las direcciones IP utilizan el formato “127.54.67.32” “número dotted”. Los controles de ejecución de conectado comprueba si la dirección es un número dotted (aunque no comprueba para asegurarse el número son equipo válido en la red). Si no, conectado supone un nombre de equipo de uno de los otros formularios.
5. Cuando se llama a Aceptar en el servidor, se pasa una referencia a un nuevo objeto de socket. Debe construir este objeto primero, pero no llama a crear para él. Tenga presente que si este objeto de socket sale del ámbito, la conexión se cierra. MFC conecta el nuevo objeto a un identificador de SOCKET . Puede crear el socket en la pila, como se muestra, o en la pila.
6. El archivo y el archivo de socket se cierran cuando salen del ámbito. El destructor del objeto de socket también llama a la función miembro de cerrar para el objeto de socket cuando el objeto salga del ámbito o eliminan.
Notas adicionales Sobre la secuencia
La secuencia de llamadas que se muestran en la tabla anterior es para un socket de secuencia. Los sockets de datagrama, que se sines conexión, no requieren CAsyncSocket::Connect, Escucha, y las llamadas de Aceptar (aunque puede utilizar opcionalmente conectado). En su lugar, si utiliza la clase CAsyncSocket, sockets de datagrama utilizan CAsyncSocket::SendTo y el miembro de ReceiveFrom funciona. (Si usa conectado con un socket de datagrama, se utiliza Enviar y Recibir.) Dado que CArchive no funciona con los datagramas, no utilice CSocket con un archivo si el socket es un datagrama.
CSocketFile no admite toda la funcionalidad de CFile ; los miembros de CFile como Seek, que no tienen ningún sentido para una comunicación de socket, no están disponibles. Debido a esto, algunas funciones de MFC Serialize predeterminado no son compatibles con CSocketFile. Esto es especialmente cierto de la clase de CEditView . No debe intentar serializar los datos de CEditView a través de un objeto de CArchive asociado a un objeto de CSocketFile mediante CEditView::SerializeRaw; uso CEditView::Serialize en su lugar (no documentado). La función de SerializeRaw espera que el objeto de archivo tiene funciones, como Seek, que CSocketFile no admite.
Para obtener más información, vea: