我想在客户端和服务器之间建立套接字通信。 我正在尝试使用无限循环进行通信。 我展示了循环的最小表达。 此循环是客户端的循环。服务器将具有类似的代码,但turno的值有所不同。 当客户的turno = 1时,服务商的turno = 2。
while(true)
{
if(turno==1)
{
//Ingreso de datos
string input;
getline(cin, input);
if (input.size() > BUFFER_LEN )
{
input = input.substr(0,BUFFER_LEN);
}
cout<<turno<<endl;
cout<<"Escribo:" <<input<<endl;
turno=2;
}
else if(turno==2)
{
cout<<"HO"<<endl;
string buffer = clientSocket.Receive();
cout<<"LA"<<endl;
turno=1;
}
}
我对循环的目标是使两个程序(client.cpp和servidor.cpp)同时运行。我的意思是,当客户端发送信息时,服务程序正在接收该信息。当服务者发送信息时,客户端正在接收信息。
但是我看不到终端中发生这种情况。
相反,在客户终端中,我得到了这张照片enter image description here。
而且,当我关闭客户端的终端时,这是在服务器enter image description here的终端中获得的
我怀疑程序在string buffer=clientSocket.Receive();
处停止,可能是因为此命令正在等待一些(未到达的)信息(来自服务器)。这意味着两个程序不能同时运行。
我还上传了用于传输消息的代码。
以下代码用于接收信息。这来自我制作套接字的类。
string socket_::Receive(void){
string buffer;
recv(client_descriptor, (char*)buffer.c_str(), BUFFER_LEN, 0);
cout<<"Mensaje Recibido"<<endl;
return buffer;};
我怀疑添加socket_类的代码是个好主意。
#define MSG_OPEN_SOCKET_ERROR "Error al iniciar el socket"
#define MSG_BIND_ERROR "Error al mapear el socket con la dirección local "
#define MSG_ACCEPT_ERROR "Error al establecer conexion con el oponente."
#define MSG_WAIT_CONNECT "Esperando al oponente..."
#define MSG_CONNECT_SUCCESS "Conexion exitosa, comienza el juego!"
#define MSG_CONNECT_ERROR "Error al conectar con el servidor."
#define MSG_SOCKET_CLOSE "Conexion finalizada exitosamente, hasta luego!"
/* Constructor por default */
socket_::socket_(){
domain = AF_INET;
type = SOCK_STREAM;
protocol = IPPROTO_TCP;
server_descriptor = 0;
client_descriptor = 0;
}
/* Inicio de socket servidor */
bool socket_::StartServer(char *port){
/* Configuro el socket del servidor */
sockaddr_in serverAddress;
bzero((char*)&serverAddress, sizeof(serverAddress)); /* Inicializo con ceros el socket */
serverAddress.sin_family = domain; /* Protocolo IPv4 */
serverAddress.sin_addr.s_addr = htonl(INADDR_ANY); /* Guardo las ip de todas las interfaces */
serverAddress.sin_port = htons(atoi(port)); /* Guardo el puerto ingresado */
/* Abro el socket en modo IPv4 - TCP */
server_descriptor = socket(domain, type, protocol);
if(server_descriptor == FLAG_OPEN_SOCKET_ERROR)
{
cout << MSG_OPEN_SOCKET_ERROR
<< endl;
return false;
}
/* Mapeo el socket con las ip locales */
int bindStatus = bind(server_descriptor, (struct sockaddr*) &serverAddress, sizeof(serverAddress));
if(bindStatus == FLAG_BIND_ERROR)
{
cout << MSG_BIND_ERROR
<< serverAddress.sin_addr.s_addr
<< ":"
<< serverAddress.sin_port
<< endl;
return false;
}
/* Escucho a la espera de conexiones entrantes, máximo 1 */
cout << MSG_WAIT_CONNECT
<< endl;
listen(server_descriptor, LISTEN_MAXCONN);
/* Acepto conexion entrante */
sockaddr_in clientAddress;
socklen_t clientAddressLenght = sizeof(clientAddress);
client_descriptor = accept(server_descriptor, (sockaddr *) &clientAddress, &clientAddressLenght);
if(client_descriptor == FLAG_ACCEPT_ERROR)
{
cout << MSG_ACCEPT_ERROR
<< endl;
return false;
}
return true;
};
/* Inicio de socket cliente */
bool socket_::StartClient(char * ip, char *port){
/* Configuro los parametros del servidor */
struct hostent* host = gethostbyname(ip); /* Si se ingreso un hostname, solicito su ip por ARP y la guardo en el formato requerido */
sockaddr_in serverAddress;
bzero((char*)&serverAddress, sizeof(serverAddress));
serverAddress.sin_family = domain; /* Protocolo IPv4 */
serverAddress.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*)*host->h_addr_list)); /* Guardo la IP destino ingresada */
serverAddress.sin_port = htons(atoi(port)); /* Guardo el puerto destino ingresado */
/* Creo el socket en modo TCP */
client_descriptor = socket(domain, type, protocol);
/* Intento conectar contra el servidor */
int status = connect(client_descriptor, (sockaddr*) &serverAddress, sizeof(serverAddress));
if(status < FLAG_CONNECT_ERROR)
{
cout << MSG_CONNECT_ERROR
<< endl;
return false;
}
cout << MSG_CONNECT_SUCCESS
<< endl;
return true;
};