C ++,无限循环,套接字,井字游戏程序

时间:2020-06-01 17:16:10

标签: c++ sockets

我想在客户端和服务器之间建立套接字通信。 我正在尝试使用无限循环进行通信。 我展示了循环的最小表达。 此循环是客户端的循环。服务器将具有类似的代码,但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;

};

0 个答案:

没有答案