Utilice el método winsock para resolver problemas de transferencia de archivos en MFC
Por qué necesitas dormir, qué es "de lo contrario se producirá un error al recibir datos", qué cosas mágicas has hecho...
Déjame preguntarte primero, ¿sabes? utilizar socket asíncrono? Lo que quiere decir con "de lo contrario se producirá un error al recibir datos", ¿significa que cuando se llama a la función de recepción, pero en realidad no llegan datos, devuelve un error?
No desea que los programas MFC ejecuten un bucle de mensajes, por lo que todo lo que tiene que hacer es agregar su propio procesamiento al bucle de mensajes y luego llamar a wsaasyncselect en el socket, para que cuando lleguen los datos, se recibirá el mensaje y luego se ejecutará el "procesamiento propio agregado". En este momento, no habrá ningún error al llamar a recepción.
Se recomienda consultar el procesamiento asincrónico de mensajes. Deja de dormir
Vale, intentaré darte una buena respuesta. Espero que se pueda adoptar.
Escribí un tutorial completo, aunque casi no hay errores en el código (para simplificar y enfatizar)
Por lo tanto, en la práctica real, debes prestar atención al error cuando estos Las funciones no se ejecutan. ¿Qué comportamiento tiene? Luego proporcione el código de procesamiento correcto.
Observe:
Primero cree una aplicación de diálogo. Para facilitar el uso de los controles, elegí una aplicación de diálogo
Recuerda agregar soporte para sockets
No me digas que no puedes dibujar una interfaz así
Luego cree Variables, el puerto del servidor de arriba es m_servport, la IP del servidor es m_servaddr y el puerto de escucha a continuación es m_listenport. Esta es la función básica
Agregar una clase, dos clases derivadas de CAsyncSocket, una para enviar archivos y otra para recibir archivos
El extremo emisor debe al menos sobrecargar estas funciones virtuales
p>
Receptor:
¡Atención!
Se debe agregar un HANDLE en ambos extremos para representar el archivo que se va a leer/escribir y el miembro público m_hFile. El archivo se abrió en el cuadro de diálogo y se envió el identificador
¡Atención!
Esta es la implementación de referencia:
Cuando se conecta un nuevo cliente, se llama a OnAccept. Deje de escuchar en este momento, luego reemplace el socket en el objeto actual con el nuevo socket y luego espere nuevamente (esperando escritura)
Cuando se pueda enviar el archivo, lea el archivo y envíelo, y luego espere la próxima oportunidad de envío. Si el archivo ha terminado de leerse, cierre la conexión
Al recibir el archivo, almacene los datos recibidos en el archivo y luego continúe esperando los datos
La conexión se cerrará una vez completado el envío, si la recepción Cuando el terminal está desconectado, significa que el archivo ha sido recopilado.
Luego está el procesamiento de botones. Para simplificar, aquí no se escribe ningún código como el de selección de archivos. Simplemente asuma que lo que se envía es c:\1.dat y se recibe el código enviado por c:\2.dat
. Tenga en cuenta que aquí solo hay nuevos y no hay eliminación, lo que significa que después de crear el objeto, se pierde el control aquí. Esta es también la razón por la que debes eliminar
esto después de recibirlo.
El código recibido es el mismo.
Los resultados de la ejecución de referencia se muestran en la figura. Preste atención para asegurarse de que exista el archivo c:\1.dat. La secuencia debe ser que el remitente ingrese al puerto, haga clic en Enviar archivo, luego el receptor ingrese la IP y el puerto, y luego haga clic en Recibir archivo. Sólo se puede hacer clic en el botón una vez. Porque no hay ningún juicio equivocado...
Dame una buena reseña, querida