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