Autor
|
Tema: Fallo al pasar por argumento ip y puerto a socket... (Leído 3,711 veces)
|
NikNitro!
Desconectado
Mensajes: 1.309
Galletaaa!!!
|
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 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;)
|
|
« Última modificación: 21 Junio 2014, 18:03 pm por NikNitro! »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
¿Cua es la primera linea de salida del programa? No deberia haber ninguna diferencia mientras tengas *:5050 ...
|
|
|
En línea
|
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!
Desconectado
Mensajes: 1.309
Galletaaa!!!
|
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: 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
|
|
« Última modificación: 21 Junio 2014, 17:25 pm por NikNitro! »
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
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.
|
|
« Última modificación: 21 Junio 2014, 17:48 pm por Eternal Idol »
|
En línea
|
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!
Desconectado
Mensajes: 1.309
Galletaaa!!!
|
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
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
47635 es 5050 en big endian.
|
|
|
En línea
|
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
Kernel coder
Moderador
Desconectado
Mensajes: 5.966
Israel nunca torturó niños, ni lo volverá a hacer.
|
Mira htons tambien. De nadas.
|
|
|
En línea
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Fallo de ¿puerto? en metasploit (exploit java)
Hacking
|
illera88
|
2
|
6,052
|
2 Diciembre 2010, 06:09 am
por Shell Root
|
|
|
Como pasar una cadena char a hexadecimal por argumento a un constant char?
Programación C/C++
|
ahaugas
|
3
|
5,694
|
13 Enero 2013, 14:09 pm
por ahaugas
|
|
|
Pasar el nombre de una subrutina como argumento de una función?
.NET (C#, VB.NET, ASP)
|
Eleкtro
|
1
|
3,485
|
19 Abril 2013, 19:45 pm
por Eleкtro
|
|
|
[C#] Pasar un argumento por Uri
.NET (C#, VB.NET, ASP)
|
DeMoNcRaZy
|
3
|
2,923
|
13 Septiembre 2015, 14:37 pm
por Eleкtro
|
|
|
Pasar color como argumento en javascript
Desarrollo Web
|
FerJGS
|
1
|
2,316
|
15 Febrero 2016, 00:36 am
por #!drvy
|
|