Autor
|
Tema: [Problema] Conexión Sockets (Leído 4,505 veces)
|
farresito
Desconectado
Mensajes: 302
|
Acabo de empezar con Sockets y generalmente entiendo todo, pero no logro arreglar un error en accept(), aun habiendo leído otros ejemplos. Agradecería muchísimo a quien pudiese echarme una mano, pues llevo un tiempo y no se que pasa. El ejemplo está ordenadito, así que no debería ser un problema entenderlo. #include <iostream> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <stdio.h> using namespace std; int main() { //Estructuras struct sockaddr_in servidor; struct sockaddr_in cliente; //Otras variables int desc_cliente, desc_servidor; int puerto = 3550, max_conex = 2, size; //Funcinn SOCKET if (desc_servidor = socket(AF_INET, SOCK_STREAM, 0) == -1) { printf("Hubo un error en SOCKET"); exit (-1); } //Estructura SOCKADDR_IN servidor.sin_family = AF_INET; servidor.sin_port = htons(puerto); servidor.sin_addr.s_addr = INADDR_ANY; memset(servidor.sin_zero, 0, 8); //Funcion BIND if (bind(desc_servidor, (struct sockaddr*) &servidor, sizeof(struct sockaddr)) == -1) { printf("Error en BIND"); exit(-1); } //Funcion listen if (listen(desc_servidor, max_conex) == -1) { printf("Error en LISTEN"); exit(-1); } //Bucle + accept while (1) { size = sizeof(struct sockaddr_in); if (cliente = accept(desc_servidor, (struct sockaddr *) &cliente, &size)) { printf("Error en ACCEPT"); exit(-1); } printf("Tienes una conexión de %s \n", inet_ntoa(cliente.sin_addr)); send(desc_cliente, "Bienvenido al servidor \n", 22, 0); close (desc_cliente); } }
Los errores que me marca son los siguientes: /home/farresito/Documentos/project/main.cpp||In function ‘int main()’:| /home/farresito/Documentos/project/main.cpp|25|warning: suggest parentheses around assignment used as truth value| /home/farresito/Documentos/project/main.cpp|55|error: invalid conversion from ‘int*’ to ‘socklen_t*’| /home/farresito/Documentos/project/main.cpp|55|error: initializing argument 3 of ‘int accept(int, sockaddr*, socklen_t*)’| /home/farresito/Documentos/project/main.cpp|55|error: no match for ‘operator=’ in ‘cliente = accept(desc_servidor, ((sockaddr*)(& cliente)), ((socklen_t*)(& size)))’| /usr/include/netinet/in.h|226|note: candidates are: sockaddr_in& sockaddr_in::operator=(const sockaddr_in&)| ||=== Build finished: 3 errors, 1 warnings ===|
Otra cosilla, porque se hace el bucle? Para que hasta que no haga un accept no termine? No acabo de entenderlo... Un abrazo de antemano. Muchas gracias por el soporte que me habéis dado hasta ahora. Saludos
|
|
|
En línea
|
|
|
|
poitier
Desconectado
Mensajes: 16
|
El error es este:
if (cliente = accept(desc_servidor, (struct sockaddr *) &cliente, &size))
Cliente lo has puesto tipo struct sockaddr_in. La llamada al sistema accept, devuelve el descriptor de socket asociado a la nueva conexión del cliente. Por lo tanto debe de ser un int. Para que te funcione tienes que poner desc_cliente.
En cuanto al bucle, haces un bucle infinito while(1). En dicho bucle aceptas conexiones entrantes, creas un socket asociadas a dichas conexiones (con accept) y envías el mensaje al cliente. Cierras la conexión con el cliente (close desc_cliente) y vuelta empezar.
Un saludo
|
|
|
En línea
|
|
|
|
farresito
Desconectado
Mensajes: 302
|
Gracias por responder, poitier. He hecho el cambio de cliente por desc_cliente en la función accept y me marca prácticamente los mismos errores. La verdad no se que pasa. Te entendí bien, y hice el cambio para que lo que retornase la función accept se fuera a la variable descriptora de cliente. Un abrazo. Aprecio de verdad vuestra ayuda
|
|
|
En línea
|
|
|
|
poitier
Desconectado
Mensajes: 16
|
Gracias por responder, poitier. He hecho el cambio de cliente por desc_cliente en la función accept y me marca prácticamente los mismos errores. La verdad no se que pasa. Te entendí bien, y hice el cambio para que lo que retornase la función accept se fuera a la variable descriptora de cliente. Un abrazo. Aprecio de verdad vuestra ayuda Perdona por la tardanza, farresito, se me fue el melón y se me olvidó responder. Veamos, hay varias cosas que tienes que corregir: - Estás programando en C, por lo que el #include <iostream> y el using namespace std, te sobra. Eso es para c++.
- Tienes que poner #include <unistd.h> para la función close
- El resto de warnings no son importantes
Mira a ver si te funciona así, sino, pregunta y lo miramos. Un saludo y suerte
|
|
|
En línea
|
|
|
|
Garfield07
Desconectado
Mensajes: 1.121
¡Este año voy a por todas! JMJ 2011
|
#include <iostream> #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <stdio.h> using namespace std; int main() { struct sockaddr_in servidor; struct sockaddr_in cliente; //Otras variables int desc_cliente, desc_servidor; int puerto = 3550, max_conex = 2, size; //Funcinn SOCKET if ((desc_servidor = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("Hubo un error en SOCKET"); exit (-1); } //Estructura SOCKADDR_IN servidor.sin_family = AF_INET; servidor.sin_port = htons(puerto); servidor.sin_addr.s_addr = INADDR_ANY; memset(servidor.sin_zero, 0, 8); //Funcion BIND if (bind(desc_servidor, (struct sockaddr*) &servidor, sizeof(struct sockaddr)) == -1) { printf("Error en BIND"); exit(-1); } //Funcion listen if (listen(desc_servidor, max_conex) == -1) { printf("Error en LISTEN"); exit(-1); } //Bucle + accept while (1) { size = sizeof(struct sockaddr_in); if ((cliente = accept(desc_servidor, (struct sockaddr *) &cliente, &size))==-1) { printf("Error en ACCEPT"); exit(-1); } printf("Tienes una conexión de %s \n", inet_ntoa(cliente.sin_addr)); send(desc_cliente, "Bienvenido al servidor \n", 22, 0); close (desc_cliente); } }
Me dice que tengo un parásito en un puñado de líneas, y el código se debería mejorar mucho, pero ahí queda. Te pongo otro código, el tuyo es muy largo y enrevesado. 100% casero #include <stdio.h> //Funciones basicas #include <string.h> //StrCmp #include <stdlib.h> //Exit y otras #include <arpa/inet.h> //struct sockaddr_in #include <sys/socket.h> //Socket, Connect... struct sockaddr_in host, client; //Declaraciones int a=sizeof (struct sockaddr); int newsock; int sockfd; int main (int argc, char *argv []) { printf ("Code 1.0 By Sagrini (2010)\n"); if ((sockfd=socket (2, 1, 0))==-1) { printf ("Error abriendo socket...\n\n"); return 1; } host.sin_port=htons(31337); host.sin_family=AF_INET; host.sin_addr.s_addr=0; if(bind(sockfd,(struct sockaddr*)&host,sizeof(host))==-1) { printf ("Error haciendo binding...\n\n"); return 1; } if(listen(sockfd,5)==-1) { printf ("Error escuchando...\n\n"); return 1; } while (1) { if((newsock=accept(sockfd, (struct sockaddr*)&client, &a))==-1) { printf ("Error esperando conectando...\n\n"); return 1; } printf ("Got connection from %s:%d\n", inet_ntoa (client. sin_addr), ntohs (client. sin_port)); send (newsock, "Hola!\r\n", 7, 0); close (newsock); } close (sockfd); return 0; }
|
|
« Última modificación: 6 Abril 2011, 10:15 am por Sagrini »
|
En línea
|
* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente. * No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado. * Si compila esta bien, si arranca es perfecto. ¡Wiki elhacker.net!Un saludo
|
|
|
poitier
Desconectado
Mensajes: 16
|
Me dice que tengo un parásito en un puñado de líneas, y el código se debería mejorar mucho, pero ahí queda. Te pongo otro código, el tuyo es muy largo y enrevesado. 100% casero #include <stdio.h> //Funciones basicas #include <string.h> //StrCmp #include <stdlib.h> //Exit y otras #include <arpa/inet.h> //struct sockaddr_in #include <sys/socket.h> //Socket, Connect... struct sockaddr_in host, client; //Declaraciones int a=sizeof (struct sockaddr); int newsock; int sockfd; int main (int argc, char *argv []) { printf ("Code 1.0 By Sagrini (2010)\n"); if ((sockfd=socket (2, 1, 0))==1) { printf ("Error abriendo socket...\n\n"); return 1; } host.sin_port=htons(31337); host.sin_family=AF_INET; host.sin_addr.s_addr=0; if(bind(sockfd,(struct sockaddr*)&host,sizeof(host))==1) { printf ("Error haciendo binding...\n\n"); return 1; } if(listen(sockfd,5)==1) { printf ("Error escuchando...\n\n"); return 1; } while (1) { if((newsock=accept(sockfd, (struct sockaddr*)&client, &a))==1) { printf ("Error esperando conectando...\n\n"); return 1; } printf ("Got connection from %s:%d\n", inet_ntoa (client. sin_addr), ntohs (client. sin_port)); send (newsock, "Hola!\r\n", 7, 0); close (newsock); } close (sockfd); return 0; }
Pues yo veo el mismo código que el de farresito, eso sí, con menos espacios Tienes varios errores en las funciones socket, bind, accept... El error es cuando devuelve -1, no 1. Te recomiendo que uses las constantes simbólicas AF_INET, SOCK_STREAM, etc. y no los valores asociados.
|
|
« Última modificación: 4 Abril 2011, 22:17 pm por poitier »
|
En línea
|
|
|
|
Garfield07
Desconectado
Mensajes: 1.121
¡Este año voy a por todas! JMJ 2011
|
Pues yo veo el mismo código que el de farresito, eso sí, con menos espacios Tienes varios errores en las funciones socket, bind, accept... El error es cuando devuelve -1, no 1. Te recomiendo que uses las constantes simbólicas AF_INET, SOCK_STREAM, etc. y no los valores asociados. No, el mío corre bien. El error del primer código es que necesita poner entre paréntesis asignaciones. Y se lo puse porque esperaba que le ayudase Luego... cierto, me has pillado. Fallo mío, o más bien del teclado xD. Nunca me acostumbraré a estas cosas xD. Ahora modifico, gracias. Y... me ahorra espacio y memoria. Y sé que son cada uno, pero es pura pereza PS: Un detalle, haz siempre caso de todos los warnings. Te ahorrará problemas Sagrini
|
|
« Última modificación: 6 Abril 2011, 10:14 am por Sagrini »
|
En línea
|
* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente. * No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado. * Si compila esta bien, si arranca es perfecto. ¡Wiki elhacker.net!Un saludo
|
|
|
poitier
Desconectado
Mensajes: 16
|
No, el mío corre bien. El error del primer código es que necesita poner entre paréntesis asignaciones. El mío corre y el suyo no. Luego... cierto, me has pillado. Fallo mío, o más bien del teclado xD. Nunca me acostumbraré a estas cosas... Y... me ahorra espacio y memoria. Y sé que son cada uno, pero gracias de todos modos. PD: Y si me vas a recomendar tú eso yo te recomendaré que hagas caso de todos los warnings. Lo que te dije te lo has tomado a mal, no pretendía ofenderte, sino ayudarte. Pero no te preocupes, que no va a volver a pasar. Tu llevas razón, gracías por tu recomendación
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
fallo conexión sockets tras cambiar router
Programación Visual Basic
|
dionisodoro
|
3
|
7,718
|
15 Febrero 2010, 21:25 pm
por fary
|
|
|
[Duda][Sockets] Procesod e conexión entre dos PCs
Scripting
|
RyogiShiki
|
0
|
3,242
|
12 Mayo 2011, 05:52 am
por RyogiShiki
|
|
|
¡Error de Conexión con Sockets!
.NET (C#, VB.NET, ASP)
|
Jesuscc29
|
4
|
20,027
|
16 Junio 2011, 21:46 pm
por Jesuscc29
|
|
|
Leer conexion mediante sockets
Análisis y Diseño de Malware
|
.:Weeds:.
|
3
|
2,979
|
20 Agosto 2011, 02:08 am
por .:Weeds:.
|
|
|
Sockets no orientados a conexion usando select
Programación C/C++
|
rootLink
|
0
|
3,327
|
5 Septiembre 2022, 14:36 pm
por rootLink
|
|