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
#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
#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