Bueno estoy programando en C++ y no consigo que los sockets intercanvien mensajes, es decir que envio algo y no se muestra nada por pantalla.
E probado con ponerle cout delante de recv pero no se muestra nada, aqui el codigo:
Servidor:
#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
using namespace std;
int linux_socket_serv(int portNum, int bufsize = 1024)
{
int client, server;
bool isExit = false;
char buffer[bufsize];
struct sockaddr_in server_addr;
socklen_t size;
//Init socket
client = socket(AF_INET, SOCK_STREAM, 0);
if (client < 0)
{
cout << "[-] Error creando socket... " << endl;
exit(1);
}
cout << "[+] Socket creado correctamente... " << endl;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(portNum);
//Conectando sockets
if (bind(client, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)
{
cout << "[-] Error conectando sockets... " << endl;
exit(1);
}
size = sizeof(server_addr);
cout << "[+] Esperando clientes... " << endl;
//Esperando clientes
listen(client, 3);
//Aceptar cliente
server = accept(client, (struct sockaddr*)&server_addr, &size);
if (server < 0)
{
cout << "[-] Error aceptando cliente... " << endl;
exit(1);
}
strcpy(buffer, "Servidor conectado...");
send(server, buffer, bufsize, 0);
cout << "[+] Conectado con cliente... " << endl;
recv(server, buffer, bufsize, 0);
close(client);
return 0;
}
int main()
{
linux_socket_serv(1500,1024);
return 0;
}
y aqui el cliente:
#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
using namespace std;
int linux_socket_clie(int portNum, char* ip, int bufsize = 1024)
{
int client, server;
bool isExit = false;
char buffer[bufsize];
struct sockaddr_in server_addr;
//Init socket
client = socket(AF_INET, SOCK_STREAM, 0);
if (client < 0)
{
cout << "[-] Error creando sockets... " << endl;
exit(1);
}
cout << "[+] Socket creado... " << endl;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portNum);
//Conectando sockets
if (connect(client, (struct sockaddr*)&server_addr, sizeof(server_addr)) == 0)
{
cout << "[+] Conectando con el servidor... " << endl;
}
cout << recv(client, buffer, bufsize, 0);
cout << "[+] Conexion confirmada... " << endl;
cin >> buffer;
send(client, buffer, bufsize, 0);
return 0;
}
int main()
{
linux_socket_clie(1500, "127.0.0.1", 1024);
return 0;
}
El programa se queda parado en:
Servidor:
- Socket creado correctamente...
- Esperando clientes...
Cliente:
- Socket creado...
En el cliente, no le pones la dirección IP? No estás usando el parámetro.
Cita de: ivancea96 en 11 Septiembre 2016, 18:04 PM
En el cliente, no le pones la dirección IP? No estás usando el parámetro.
Es verdad, lo que ahora nose, es dondo tengo que situar la direccion ip, puede ser que tenga que situarlo en en struct sockaddr*)&server?
if (connect(client, (struct sockaddr*)&server_addr, sizeof(server_addr)) == 0)
En la estructura sí. Mira esta página, por ejemplo: http://es.tldp.org/Tutoriales/PROG-SOCKETS/prog-sockets.html (http://es.tldp.org/Tutoriales/PROG-SOCKETS/prog-sockets.html)
Ve directamente al código del cliente, abajo, si quieres.
Cita de: ivancea96 en 11 Septiembre 2016, 18:50 PM
En la estructura sí. Mira esta página, por ejemplo: http://es.tldp.org/Tutoriales/PROG-SOCKETS/prog-sockets.html (http://es.tldp.org/Tutoriales/PROG-SOCKETS/prog-sockets.html)
Ve directamente al código del cliente, abajo, si quieres.
Si, esa pagina la e estado mirando un rato, ahora e un codigo de otra pagina, ya se mas o menos la estructura basica de los sockets, asi que moldeare un poco a mi gusto y ya lo pasare por aqui ;-)
Bueno estuve buscando un poco, y el problema no es tan sencillo, el problema esta en que no defini 2 variables de la estructura server_addr
me falta por declarar:
server_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(server_addr.sin_zero),sizeof(server_addr); //Este lo tengo a medias, si no lo entiendo mal rellena con ceros server_addr.sin_zerp (no lo tengo demasiado claro
El problema es que busco codigos similares y cada uno me sale distinto y ya nose que puedo tener, mi idea es poner server_addr.sin_addr = a la ip pero hay que hacer varios procedimientos que no entiendo
La parte de bzero tampoco lo tengo del todo claro, porque en el codigo original ponia en vez de poner server_addr ponia solo 8 y me ha dejado sin entender
En el cliente de la página esa tienes el programa completo y correcto. Mira la parte que te falta en él, y fíjate en qué hace.