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;)
¿Cua es la primera linea de salida del programa? No deberia haber ninguna diferencia mientras tengas *:5050 ...
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
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.
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 ;)
47635 es 5050 en big endian.
Ok, buscaré info. Muchas gracias ;)
Mira htons tambien. De nadas.