Sockets linux

Iniciado por Poyoncio, 10 Septiembre 2016, 16:40 PM

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

Poyoncio

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:
Código (cpp) [Seleccionar]

#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:
Código (cpp) [Seleccionar]

#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...
Curso de ensamblador desde cero

ivancea96

En el cliente, no le pones la dirección IP? No estás usando el parámetro.

Poyoncio

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?
Código (cpp) [Seleccionar]
if (connect(client, (struct sockaddr*)&server_addr, sizeof(server_addr)) == 0)
Curso de ensamblador desde cero

ivancea96

En la estructura sí. Mira esta página, por ejemplo: http://es.tldp.org/Tutoriales/PROG-SOCKETS/prog-sockets.html

Ve directamente al código del cliente, abajo, si quieres.

Poyoncio

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

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  ;-)
Curso de ensamblador desde cero

Poyoncio

#5
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:
Código (cpp) [Seleccionar]
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 
Curso de ensamblador desde cero

ivancea96

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.