Cómo implementar la comunicación multiproceso entre el cliente y el servidor usando el socket C++
Una idea es utilizar funciones multiproceso en el lado del servidor. Cuando se recibe una solicitud del cliente, se abre un nuevo hilo para realizar la comunicación entre el cliente y el servidor.
Para métodos específicos, consulte el siguiente ejemplo (compilado en vs2015): //Lado del servidor:
#define?_WINSOCK_DEPRECated_NO_WARNINGS?
#include
#include
#include
#pragma?comment(lib,?"ws2_32.lib ")?
usando?namespace?std;?
enum{PORT?=?8621};?
void?thread_fun(void?*p) ?
{?
//Función del hilo de comunicación
char?s[1024];?
SOCKET?socka?=? (SOCKET)p;?
char?*str?=?"¡hola?cliente!";?
sockaddr_in?sa?=?{?AF_INET?};? p>
int?n_Len?=?sizeof(sa);?
send(socka,?str,?strlen(str),?0);?
/ /Obtener la dirección IP del cliente
getpeername(socka,?(sockaddr*)&sa,?&n_Len);?
cout?<
while?(true)//¿Bucle para recibir datos? p >
{?
int?i?=?recv(socka,?s,?sizeof(s),?0);?
if?(i? < =?0)?
{?
cout?<
cout?<
break;?
}?
s[i]?=?0;?
cout?<
}?
}
int?main()?
{?
WSADATA?wd;?
WSAStartup(0x0202,?&wd);//Inicializar la carga de ws2_32. lib
SOCKET?sock?=?socket(AF_INET,?SOCK_STREAM,?0);?//¿Inicializar el socket?
if?(sock?==?INVALID_SOCKET)?
{?
cout?<
retorno?-1;?
}?
calcetín
dr_in?sa?=?{?AF_INET,htons(PORT)?};?
if?(bind(sock,?(sockaddr*)&sa,?sizeof(sa))?0) ?//¿Puerto de enlace?
{?
cout?<
return?-1;
}?
escucha(calcetín,?5);//¿Escuchas?
mientras?(verdadero)?
{ ?
SOCKET?socka?=?accept(sock,0,NULL);?//¿Toma de comunicación?
_beginthread(thread_fun,?0,?(void*) socka); ?//Crear hilo
}?
return?0;?
}?
//Cliente:
#define?_WINSOCK_DEPRECATED_NO_WARNINGS?
#include
#include
#comentario(lib, ?"ws2_32.lib")?
usando?namespace?std;?
enum?{?PORT?=?8621?};? ?main()?
{?
WSADATA?wd;?
WSAStartup(0x0202,?&wd);//Inicializar carga ws2_32 .lib p>
SOCKET?sock?=?socket(AF_INET,?SOCK_STREAM,?0);?//¿Inicializar el socket?
if?(sock?==?INVALID_SOCKET )?
{?
cout?<
retorno?-1;?
}?
sockaddr_in?sa?=?{?AF_INET,htons(PORT)?};//¿Especificar información de dirección?
sa.sin_addr.S_un.S_addr? =?inet_addr(" 127.0.0.1");?
int?n_Len?=?sizeof(sa);?
if(SOCKET_ERROR?==connect(sock,?( sockaddr*)&sa, ?n_Len))?//¿Conexión?
{?
cout?<
retorno?- 1;?
}?
char?s[1024];?
int?n?=?recv(calcetín,? s,?sizeof( s),?0);//¿Recibir datos?
if?(n?>?0)?
{?
s[n]? =?0;?
cout?<
}?
¿mientras?(verdadero )?
{?
cout?<"Por favor, introduce el contenido a enviar:";?
cin?>>?s;?
enviar(calcetín,?s,?strl
es(s),?0);?
}?
retorno?0;?
}