¿Cómo recibe MFC datos a través de sockets?
I. El proceso de recepción y envío:
Lado del servidor
1. Crear un socket de servidor (CREAR).
2. Vincule el socket del servidor (BIND) y comience a escuchar las conexiones (LISTEN).
3. Aceptar la solicitud de conexión del cliente (ACEPTAR) y crear un proceso de recepción.
4. Iniciar la transmisión de datos (enviar, recibir).
5. Cerrar el enchufe (CLOSESOCKET).
Cliente
1. Cree un socket de cliente (CREAR).
2. Conéctese al servidor remoto (CONNECT) y, si acepta, cree un proceso de recepción.
3. Iniciar la transmisión de datos (enviar, recibir).
4. Cerrar el enchufe (CLOSESOCKET).
II.Implementar en VC:
Lado del servidor:
I.
Utilice APP WIZARD para crear un proyecto MFC EXE. WIZARD va al cuarto paso y selecciona "Windows Sockets" en "¿Qué funciones le gustaría incluir?". Se pueden seleccionar opciones para otros pasos según la aplicación real. Esto creará un proyecto inicializado y habilitado para SOCKET.
Si desea agregar compatibilidad con SOCKET a un proyecto existente, solo necesita hacer dos cosas:
1. Incluya el archivo de encabezado WINSOCK.H en el archivo stdafx.h ( # incluir "winsock.h").
2. Agregue el siguiente código de socket de inicialización a "::InitInstance()" en la función miembro de la clase de aplicación. if?(!AfxSocketInit())
{AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return?FALSE;}
2. Cree un socket de servicio y cree un hilo de escucha.
//Crear un socket de servicio
SOCKET?sercon=socket(PF_INET,SOCK_STREAM,0);
//Determinar si la creación fue exitosa
if? ( sercon===INVALID_SOCKET)
{ AfxMessageBox("¿Servidor? ¿MAL?!") ; return?}
/ Configurar la dirección del socket y otra información
SOCKADDR_IN?sin;
sin.sin_family=AF_INET;
/Especificar dirección local
sin.sin_addr .s_addr=htonl(INADDR_ANY
);//Especifique el número de puerto del servidor nPort, que se puede configurar automáticamente
int?nPort=5080;
sin.sin_port=htonl(nPort);
p>/La información de la dirección está vinculada al socket.
if?(bind(sercon,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
{ AfxMessageBox("bind?wrong!"); return?
// Crea una cola de escucha (tamaño 3) y comienza a escuchar
if?(listen(sercon,3)= = SOCKET_ERROR)
{AfxMessageBox("listen?wrong!"); return?-1;};
① Implemente el hilo de escucha y cree el hilo de recepción de datos.
//El creador necesita iniciar el hilo de escucha para las conexiones de escucha e implementarlo.
//Crear el hilo de escucha (en el inicio del programa o en la implementación del evento del botón)
AfxBeginThread(waitconnect,NULL);
//Implementar el hilo de escucha
UINT waitconnect(LPVOID lpParm)
{ SOCKET conn[3]; int lenc=sizeof(sockaddr); int yacon=0; while(1) {if (yacon<=3) {/Aceptar solicitud de conexión conn[alreadycon]= aceptar(sercon,&cin,&lenc); if (conn[alreadycon]==INVALID_SOCKET) {AfxMessageBox("aceptar ¡MAL!") ;}
else
{//Crear hilo de recepción de datos
AfxBeginThread(readdata,&connn[readycon]);
Alreadycon = yacon + 1;
devuelve 0;}}.
else
{// Evite interferir con la ejecución del hilo principal
Sleep(200);}
} p>
}
② Implementar el hilo de recepción de datos.
UINT waitconnect(LPVOID ss)
{ SOCKET *readsock;
readsock=(SOCKET *)ss;
char buf[ 2000];
int revnum=0;
//Inicia bucle para aceptar datos
while (revnum!=-1)
{/revnum<=0 significa que la conexión está interrumpida.
revnum=recv(*readsock,buf,2000,0);
if (revnum>0)
buf[revnum]=0;// truncar el buffer
//Almacenar los datos aceptados en buf.}
}
③ Enviar datos
/conn[1] es el socket utilizado para aceptar conexiones y sendstr son los datos enviados.
send(conn[1],LPCTSTR(sendstr),sendstr.GetLength(),0);
④ Cierra el socket.
//conn[1] es el socket utilizado para aceptar conexiones
closesocket(conn[1]);
Terminal de cliente:
El lado del cliente se programa utilizando mucho código igual o similar al del lado del servidor.
I.Crear un programa que soporte SOCKET.
El método es el mismo que en el lado del servidor.
II.Crear un socket de cliente y establecer una conexión con el servidor.
//nHost debe ser el servidor remoto, IP o nombre de dominio especificado por el usuario.
CString nHost;
//h es la información de la dirección
struct hostent *h;
h=gethostbyname(nHost);
//nHost debe ser el número de puerto de servicio remoto especificado por el usuario
int nPort )
SOCKET con_client
SOCKADDR_IN csin; ;
SOCKET con_client;
SOCKADDR_IN csin
p>
if (h!sin_port= htons(nPort);
//Iniciar conexión
if (connect(con_client,(LPSOCKADDR)&csin,sizeof(csin)) )
{/AfxMessageBox(" ¡conectar mal!");? p>
return -1;}
else
{// AfxMessageBox(" ¡conectar mal!");?)
{//AfxMessageBox (" ¡conectar mal!");?)
return -1;}
else
{//AfxMessageBox(" ¡conectar mal!");? )
{//AfxMessageBox(" ¡conectar mal!");? Recibiendo hilo.
El código es el mismo que el del lado del servidor.
IV.
/con_client es el socket que se conecta al servidor.
send(con_client,LPCTSTR(sendstr),sendstr.GetLength(),0);
V.
// con_client es el socket que se conecta al servidor.
closesocket(conn[1]);
En la operación real, el alcance de algunas variables debe ajustarse y cambiarse según sea necesario.