Fallo al pasar por argumento ip y puerto a socket...

Iniciado por NikNitro!, 21 Junio 2014, 11:28 AM

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

NikNitro!

Mi fallo consiste en pasar por argumento la ip y el puerto. Si lo introduzco desde dentro (como está comentado) funciona...
Aquí el trozo de cliente
Código (cpp) [Seleccionar]


int main(int argc, char *argv[]) {
int sck, rtn;
// const int PUERTO = 5050;
const int PUERTO = atoi(argv[argc-1]);
cout << argv[1] << ":" << PUERTO << "\n\n";

struct sockaddr_in server;
char bufferIn[2000], bufferOut[2000], bufferAux[2000];
//creamos socket
sck = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sck == -1) {
cout << "No se puede crear el socket";
}
puts("Socket creado");

server.sin_family = PF_INET;
server.sin_port = htons(PUERTO);
server.sin_addr.s_addr = inet_addr(argv[1]);
// server.sin_addr.s_addr = inet_addr("127.0.0.1");

//Conectando al servidor
if (connect(sck, (struct sockaddr*) (&server), sizeof(server)) < 0) {
perror("Conexion fallida. error");
return 1;
}


Espero que podais decirme en que tontería estoy metiendo la pata.

Muchas gracias;)

Eternal Idol

¿Cua es la primera linea de salida del programa? No deberia haber ninguna diferencia mientras tengas *:5050 ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

NikNitro!

#2

niknitrodeb@debian:~$ ./a.out 127.0.0.1 5050
127.0.0.1:5050

Socket creado
Conexion fallida. error: Connection refused
niknitrodeb@debian:~$ ./a.out "127.0.0.1" 5050
127.0.0.1:5050

Socket creado
Conexion fallida. error: Connection refused
niknitrodeb@debian:~$ ./a.out '127.0.0.1' 5050
127.0.0.1:5050

Socket creado
Conexion fallida. error: Connection refused
niknitrodeb@debian:~$



Ni con comillas simples, ni dobles ni sin ellas. Sin embargo si guardara puertos e ip dentro del main funciona; pero necesito que sea por paso de argumentos.

Saludos;)

PD: aquí tienes un trozo del servidor:

Código (cpp) [Seleccionar]

int main(int argc, char *argv[]) {

int listen_socket, cliente, rtn;
struct sockaddr_in server, clientinfo;
// const int PUERTO = 5050;
const int PUERTO;
PUERTO = atoi(argv[0]);

//SOCKET
listen_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (listen_socket == -1) {
perror("No se puede crear el socket");
return 1;
}
cout << "Socket creado\n";

//preparar la estructura sockaddr_in
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(PUERTO);

//BIND
rtn = bind(listen_socket, (struct sockaddr*)&server, sizeof(server));
if (rtn < 0) {
perror("Error en el bind");
return 1;
}
puts("Bind hecho");

//LISTEN
rtn = listen(listen_socket, 1); //1 es el maximo de conexiones a la vez
puts("Esperando conexiones entrantes");
/*if (rtn < 0) {
perror("Error en el listen");
return 1;
}*/

while (true) {

sockaddr client;
socklen_t c = sizeof(client);
//ACCEPT
cliente = accept(listen_socket, &client, &c);
if (cliente < 0) {
perror("Error en el accept");
return 1;
}
cout << "Conexion aceptada en el puerto " << server.sin_port << "\n";
fflush(stdout);


El cual abro antes y se queda:

niknitrodeb@debian:~$ ./server.out 5050
Socket creado
Bind hecho
Esperando conexiones entrantes

__________________________________________________________________________________________________________

EDITO: Le he hecho un cambio en el servidor y no me muestra el puerto bien... El cambio es el siguiente:

        const int PUERTO = atoi(argv[0]); //Porque me daba error separado (supongo que por modificar una constante)
//Y bajo el listen he cambiado ese put por esto:

puts("Esperando conexiones entrantes en el puerto ");
cout << server.sin_port;


RESULTADO:


niknitrodeb@debian:~$ ./server.out 5050
Socket creado
Bind hecho
Esperando conexiones entrantes en el puerto



No me muestra el puerto. ¿Será que no lo toma bien de argv?

Salud

Eternal Idol

#3
niknitrodeb@debian:~$ ./a.out 127.0.0.1 5050
127.0.0.1:5050

¿Como que no funciona ahi?

El primer argumento (argv[0]) suele ser el nombre del programa y solo el segundo el pasado por linea de comandos, asi que el servidor tiene que ser el problema. Primero proba con el valor hardcodeado en el servidor y no en el cliente ... eso deberia funcionar, entonces arregla el servidor.

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

NikNitro!

Sabía que era una tontería. Acertaste xD. Metí la pata escribiendo el 0 -.-

Por cierto, una duda... Ahora mismo funciona, antes cuando metía los valores dentro del main también; pero en ambos casos usa un puerto distinto al que le doy. Por ejemplo ahora mismo:
SERVIDOR:

niknitrodeb@debian:~$ ./server.out 5050
Socket creado
Bind hecho
Esperando conexiones entrantes en el puerto
47635Conexion aceptada en el puerto 47635
Conectado en el puerto 47635. Esperando accion.
RECIBIDO: hola

enviado : hola
Conectado en el puerto 47635. Esperando accion.
RECIBIDO: que


enviado : que

Conectado en el puerto 47635. Esperando accion.


CLIENTE:

niknitrodeb@debian:~$ ./a.out 127.0.0.1 5050
127.0.0.1:5050

Socket creado
Conectado

Conectado al servidor 127.0.0.1:47635.
Que desea enviar?
hola

Devuelto hola

Conectado al servidor 127.0.0.1:47635


Y si cierro y abro vuelven a usar el mismo. Es por algo en especial? Funcionar funciona xD
Será que el 5050 lo usan para la conexion y luego ese lo usan para transmitir datos?

Saludos y gracias Eternal Idol ;)

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón


Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón