Incorrecta implementación de Thread?

Iniciado por Debci, 18 Noviembre 2012, 14:05 PM

0 Miembros y 1 Visitante están viendo este tema.

Debci

Hola a todos los foreros, compañero de elhacker.net

Tras mucho tiempo sin hacer nada de C++ me he dispuesto a practicar un poco, con algunos sockets y threads.
El problema es que no estoy muy seguro de como funciona la cosa (que fácil es en Java...).
La idea es un servidor que esta esperando siempre a un cliente para recibir de este, un buffer con una cadena de texto que mostrará por pantalla.
La idea, para probarlo, ha sido que el cliente dentro de un while, y este dentro de la acción que se introduce a thread, se dedique a enviar de forma indefinida una cadena de texto.
Sin mas os dejo el código fuente:

Todo, esta realizado con el IDE codeblocks y el entorno MinGW.

Cliente:
Código (cpp) [Seleccionar]

#include <iostream>
#include <windows.h>
#define PUERTO 8080
#include <process.h>
using namespace std;

WSADATA wsa;
SOCKET cliente;
sockaddr_in remoto;

int error();

void Thread( void* pParams )
  {
    if(WSAStartup(MAKEWORD(2,2), &wsa)){

    }
    remoto.sin_family = AF_INET;
    remoto.sin_port = htons(PUERTO);                                    // Puerto donde nos conectaremos
    //remoto.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");             // IP del servidor a donde nos conectaremos
    remoto.sin_addr = *((in_addr*)gethostbyname("localhost")->h_addr);  // Host a donde nos conectaremos
    while(1){
    cliente = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);        // Protocolo TCP
    if(cliente == INVALID_SOCKET){

    }
    if(connect(cliente, (sockaddr*)&remoto, sizeof(sockaddr))){     // Conectamos con el servidor

    }
    string buffer = "Hola, soy un cliente en C++!";
    send(cliente, buffer.c_str(), buffer.length(), 0);                          // Enviamos un saludo
    closesocket(cliente);                                                       // Finalmente desconectamos...
    WSACleanup();
    }
  }

int main(){
    _beginthread( Thread, 0, NULL );


    return 0;
}


Servidor:
Código (cpp) [Seleccionar]

#include <iostream>
#include <windows.h>
#pragma comment(lib, "Ws2_32.lib")
#define PUERTO 8080
#include <pthread.h>

using namespace std;

WSADATA wsa;
pthread_t hilo;
SOCKET servidor, nueva_conexion;
sockaddr_in local;

int error();

int main(){
    local.sin_port = htons(PUERTO);         
    local.sin_family = AF_INET;           
    local.sin_addr.S_un.S_addr = INADDR_ANY; 

    if(WSAStartup(MAKEWORD(2,2), &wsa)){
        return error();
    }
    servidor = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if(servidor == INVALID_SOCKET){
        return error();
    }
    if(bind(servidor, (sockaddr*)&local, sizeof(sockaddr)) == SOCKET_ERROR){
        return error();
    }

    if(listen(servidor, 1) == SOCKET_ERROR){   
        return error();
    }

    cout << "Servidor a la escucha por el puerto " << PUERTO << ", esperando conexión." << endl;
while(1){
    do{
        nueva_conexion = accept(servidor, NULL, NULL); // Esperamos una conexión entrante y la aceptamos.
    } while(nueva_conexion == SOCKET_ERROR);

    string mensaje = "Servidor C++!";

    send(nueva_conexion, mensaje.c_str(), mensaje.length(), 0); // Enviamos un mensaje al cliente conectado

    int bytes_recv;
    char buffer[256];



        memset(buffer, 0, sizeof(buffer)); // Limpiamos el buffer.
    do{
        bytes_recv = recv(nueva_conexion, buffer, sizeof(buffer), 0);   // Esperamos para recibir datos...
    } while(bytes_recv == 0 && bytes_recv != SOCKET_ERROR);

    if(bytes_recv > 0){
        cout << "Buffer: " << buffer << " - Bytes recibidos: " << bytes_recv << endl;

    }

}
    closesocket(nueva_conexion);                                    // Lo desconectamos!

    WSACleanup();

    return 0;
}

int error(){
    cout << "Error #" << GetLastError() << endl;
    WSACleanup();

    return 0;
}


El problema aparece, cuando al ejecutar el cliente, este ni siquiera comienza el bucle, es decir, el thread no se inicia o por algún motivo esta mal usada la función.

Gracias por vuestro tiempo.
Un saludo