Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Riki_89D en 25 Septiembre 2011, 18:25 pm



Título: Problema con sockets WinSock2
Publicado por: Riki_89D en 25 Septiembre 2011, 18:25 pm
Hola que tal,recien estoy con los sockets,intento conectarme a una IP,por el puerto 80 ya que es una pagina,solo quiero conectar,el codigo no da error,peor el IF que averigua si se conecta me da el error,miren:

Código
  1. SOCKET Cliente;
  2. u_short Puerto = 80;
  3. SOCKADDR_IN SockAddr;
  4. char Datos[] = "Hola";
  5. WSADATA skd;
  6.  
  7. int main(void)
  8. {
  9. if(WSAStartup(MAKEWORD(2,0),&skd) != 0)
  10. {
  11. std::cout << "Error initializing socket";
  12. std::cin.get();
  13. return 0;
  14. }
  15. if(socket(AF_INET,SOCK_STREAM,IPPROTO_TCP) == INVALID_SOCKET)
  16. {
  17. std::cout <<"Invalid socket";
  18.  
  19. return 1;
  20. }
  21.  
  22. memset(&SockAddr,0,sizeof(SockAddr));
  23.  
  24. SockAddr.sin_family = AF_INET;
  25. SockAddr.sin_port = htons(Puerto);
  26. SockAddr.sin_addr.s_addr = inet_addr("74.125.39.99");
  27. int con = connect(Cliente,(SOCKADDR *)&SockAddr,sizeof(SOCKADDR_IN));
  28. if(con != 0)
  29. {
  30. std::cout << "Error connecting";
  31. std::cin.get();
  32. return 1;
  33. }
  34.  
  35.  

parece que no conecta :S,algun error ven?¿


Título: Re: Problema con sockets WinSock2
Publicado por: naderST en 25 Septiembre 2011, 19:04 pm
Nunca le asignas a Cliente lo que devuelve la función socket()...
Código
  1. Cliente = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  2.  


Título: Re: Problema con sockets WinSock2
Publicado por: Riki_89D en 25 Septiembre 2011, 19:32 pm
Hola,que tal,acabo de agregar la linea que me as dicho,el programa enciende,se queda un rato pensando (cosa que no hacia antes) pero alfinal me tira el mismo error :(


Título: Re: Problema con sockets WinSock2
Publicado por: naderST en 25 Septiembre 2011, 19:39 pm
Cual error te tira?


Título: Re: Problema con sockets WinSock2
Publicado por: Riki_89D en 25 Septiembre 2011, 19:51 pm
Bueno es el erro que e escrito yo en el utlimo "cout" en la funcion "connect"


Título: Re: Problema con sockets WinSock2
Publicado por: naderST en 25 Septiembre 2011, 19:59 pm
Cambia esto:

Código
  1. connect(Cliente,(SOCKADDR *)&SockAddr,sizeof(SOCKADDR_IN))
  2.  

Por esto:

Código
  1. connect(Cliente,(SOCKADDR *)&SockAddr,sizeof(SOCKADDR))
  2.  


Título: Re: Problema con sockets WinSock2
Publicado por: Riki_89D en 25 Septiembre 2011, 20:05 pm
Hey,acabo de probar,pero nada sigue sin funcionar :( que raro verdad?¿

puede ser algo de mi ordenador?¿ :S




Título: Re: Problema con sockets WinSock2
Publicado por: naderST en 25 Septiembre 2011, 20:07 pm
La verdad no veo el error, pero aquí te dejo mi código que me funcionó:

Código
  1. #include <iostream>
  2. #include <Windows.h>
  3. #pragma comment(lib, "Ws2_32.lib")
  4. #define PUERTO 80
  5.  
  6. WSADATA wsa;
  7. SOCKET cliente;
  8. sockaddr_in remoto;
  9.  
  10. int error();
  11.  
  12. int main(){
  13. if(WSAStartup(MAKEWORD(2,2), &wsa))
  14. return error();
  15.  
  16. remoto.sin_family = AF_INET;
  17. remoto.sin_port = htons(PUERTO);
  18. remoto.sin_addr = *((in_addr*)gethostbyname("www.google.com")->h_addr);
  19.  
  20. cliente = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  21.  
  22. if(cliente == INVALID_SOCKET)
  23. return error();
  24.  
  25. if(connect(cliente, (sockaddr*)&remoto, sizeof(sockaddr)))
  26. return error();
  27.  
  28. closesocket(cliente);
  29.  
  30. WSACleanup();
  31.  
  32. return 0;
  33. }
  34.  
  35. int error(){
  36. std::cout << "Error #" << GetLastError() << std::endl;
  37. WSACleanup();
  38.  
  39. getchar();
  40.  
  41. return 0;
  42. }


Título: Re: Problema con sockets WinSock2
Publicado por: Riki_89D en 25 Septiembre 2011, 20:25 pm
perfecto el tuyo si funciona,de todas formas me gustaria saber que a pasado con mi codio mas que nada para aprender un poco mas :) unca viene mal sia lguien ve el error sera de agradecer,muchas gracias por el code ^^


Título: Re: Problema con sockets WinSock2
Publicado por: naderST en 25 Septiembre 2011, 20:43 pm
Creo que porque usaste la estructura SOCKADDR_IN y no sockaddr_in no se la verdad no estoy seguro.


Título: Re: Problema con sockets WinSock2
Publicado por: Riki_89D en 25 Septiembre 2011, 20:49 pm
hey,donde pone "google.com" ai e puesto "localhost",i em tira el error 10061 k significa conexion rechazada,por lo visto nop pueod conectar a mi propio host,sabes que puede ser?


Título: Re: Problema con sockets WinSock2
Publicado por: naderST en 26 Septiembre 2011, 05:10 am
Que raro... si tienes algún servidor a la escucha en el puerto que te estás tratando de conectar debería funcionar.


Título: Re: Problema con sockets WinSock2
Publicado por: Riki_89D en 26 Septiembre 2011, 21:22 pm
Hola de nuevo,que tal,me surio un pequeño problemilla,ya consegui conectar los sockets i enviar datos al servidor,lo que pasa uqe cuando mando un simple "Hola" al llegar al servidor llega como caracteres raros :S no llega el "Hola" llegan cosas como "?$%" o cosas asin.....por que puede ser?¿


Título: Re: Problema con sockets WinSock2
Publicado por: naderST en 26 Septiembre 2011, 21:43 pm
El servidor lo hiciste tu? Si muestras algo de código sería mejor...


Título: Re: Problema con sockets WinSock2
Publicado por: Riki_89D en 26 Septiembre 2011, 21:56 pm
Cliente:

Código
  1. #include "windows.h"
  2. #include "iostream"
  3. #pragma comment(lib,"ws2_32.lib")
  4.  
  5. #define PORT 9999
  6.  
  7. WSADATA wsa;
  8. SOCKET Client;
  9. int Conexion;
  10. sockaddr_in Remote_Server;
  11.  
  12. int Error()
  13. {
  14. std::cout << "Error " << GetLastError() << std::endl;
  15. getchar();
  16. return 0;
  17. }
  18.  
  19. int main(void)
  20. {
  21.    if(WSAStartup(MAKEWORD(2,0),&wsa) != 0)
  22. {
  23. Error();
  24. }
  25.  
  26. Remote_Server.sin_family = AF_INET;
  27. Remote_Server.sin_port = htons(PORT);
  28. Remote_Server.sin_addr = *((in_addr *)gethostbyname("localhost")->h_addr);
  29.  
  30. Client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  31.  
  32. Conexion = connect(Client,(sockaddr *)&Remote_Server,sizeof(sockaddr));
  33.  
  34. if(Conexion == INVALID_SOCKET)
  35. {
  36. Error();
  37. }
  38.  
  39. char *Buffer = (char*)malloc(5);
  40. send(Client,Buffer,strlen(Buffer),0);
  41. free(Buffer);
  42.  
  43. return 0;
  44. }
  45.  


Servidor:
Código
  1. #include "windows.h"
  2. #include "iostream"
  3. #pragma comment(lib,"ws2_32.lib")
  4.  
  5. #define PORT 9999
  6.  
  7. WSADATA wsa;
  8. SOCKET Client;
  9. int Conexion;
  10. sockaddr_in Remote_Server;
  11.  
  12. int Error()
  13. {
  14. std::cout << "Error " << GetLastError() << std::endl;
  15. getchar();
  16. return 0;
  17. }
  18.  
  19. int main(void)
  20. {
  21.    if(WSAStartup(MAKEWORD(2,0),&wsa) != 0)
  22. {
  23. Error();
  24. }
  25.  
  26. Remote_Server.sin_family = AF_INET;
  27. Remote_Server.sin_port = htons(PORT);
  28. Remote_Server.sin_addr = *((in_addr *)gethostbyname("localhost")->h_addr);
  29.  
  30. Client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  31.  
  32. Conexion = bind(Client,(SOCKADDR*)&Remote_Server,sizeof(Remote_Server));
  33. listen(Client,10);
  34. accept(Client,NULL,NULL);
  35. char *Buffer = (char*)malloc(5);
  36. while(true)
  37. {
  38.  
  39. recv(Client,Buffer,strlen(Buffer),0);
  40. if(strcmp(Buffer,"Hola"))
  41. {
  42. break;
  43. }
  44.  
  45. }
  46. std::cout << Buffer <<std::endl;
  47. getchar();
  48. free(Buffer);
  49. return 0;
  50. }
  51.  

los datos se mandan,pero no se ven los caracteres correcamente


Título: Re: Problema con sockets WinSock2
Publicado por: naderST en 26 Septiembre 2011, 22:13 pm
En el cliente nunca le asignas ningún contenido a la variable Buffer, de esta manera:

Cliente:
Código
  1. #include "windows.h"
  2. #include "iostream"
  3. #pragma comment(lib,"ws2_32.lib")
  4.  
  5. #define PORT 9999
  6.  
  7. WSADATA wsa;
  8. SOCKET Client;
  9. int Conexion;
  10. sockaddr_in Remote_Server;
  11.  
  12. int Error()
  13. {
  14. std::cout << "Error " << GetLastError() << std::endl;
  15. getchar();
  16. return 0;
  17. }
  18.  
  19. int main(void)
  20. {
  21.    if(WSAStartup(MAKEWORD(2,0),&wsa) != 0)
  22. {
  23. Error();
  24. }
  25.  
  26. Remote_Server.sin_family = AF_INET;
  27. Remote_Server.sin_port = htons(PORT);
  28. Remote_Server.sin_addr = *((in_addr *)gethostbyname("localhost")->h_addr);
  29.  
  30. Client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  31.  
  32. Conexion = connect(Client,(sockaddr *)&Remote_Server,sizeof(sockaddr));
  33.  
  34. if(Conexion == INVALID_SOCKET)
  35. {
  36. Error();
  37. }
  38.  
  39. char buffer[] = "Hola";
  40. send(Client,buffer,strlen(buffer),0);
  41.  
  42. return 0;
  43. }
  44.  

Y lo recibes mal no le puedes hacer strlen() a Buffer

Servidor:
Código
  1. #include "windows.h"
  2. #include "iostream"
  3. #pragma comment(lib,"ws2_32.lib")
  4.  
  5. #define PORT 9999
  6.  
  7. WSADATA wsa;
  8. SOCKET Client;
  9. int Conexion;
  10. sockaddr_in Remote_Server;
  11.  
  12. int Error()
  13. {
  14. std::cout << "Error " << GetLastError() << std::endl;
  15. getchar();
  16. return 0;
  17. }
  18.  
  19. int main(void)
  20. {
  21.    if(WSAStartup(MAKEWORD(2,0),&wsa) != 0)
  22. {
  23. Error();
  24. }
  25.  
  26. Remote_Server.sin_family = AF_INET;
  27. Remote_Server.sin_port = htons(PORT);
  28. Remote_Server.sin_addr = *((in_addr *)gethostbyname("localhost")->h_addr);
  29.  
  30. Client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
  31.  
  32. Conexion = bind(Client,(SOCKADDR*)&Remote_Server,sizeof(Remote_Server));
  33. listen(Client,10);
  34. accept(Client,NULL,NULL);
  35. char *Buffer = (char*)malloc(5);
  36. while(true)
  37. {
  38.  
  39. memset(Buffer, 0, 5);
  40. recv(Client,Buffer,4,0);
  41. if(!strcmp(Buffer,"Hola"))
  42. {
  43. break;
  44. }
  45.  
  46. }
  47. std::cout << Buffer <<std::endl;
  48. getchar();
  49. free(Buffer);
  50. return 0;
  51. }

PD: Recuerda que strcmp() devuelve 0 si las cadenas son iguales.


Título: Re: Problema con sockets WinSock2
Publicado por: Riki_89D en 26 Septiembre 2011, 22:24 pm
Hola,acabo de probar los codigo,pero no recibe nad ale servidor....:S se queda con la pantalla negra


Título: Re: Problema con sockets WinSock2
Publicado por: naderST en 26 Septiembre 2011, 22:36 pm
No me había fijado pero estás aceptando mal la conexión... en la parte donde llamas a la función accept() deberías hacer algo así:

Código
  1. SOCKET nueva_conex;
  2. do{
  3. nueva_conex = accept(Client, NULL,NULL);
  4. }while(nueva_conex == SOCKET_ERROR);

Y en esta parte en el servidor deberías cambiarla así:

Remote_Server.sin_addr = *((in_addr *)gethostbyname("localhost")->h_addr);

por

Remote_Server.sin_addr = INADDR_ANY;

Edit:

Recuerda que cuando llames accept() te devolverá una variable tipo SOCKET que es la nueva conexión que acabas de aceptar y esa variable es la que utilizarás para enviar/recibir los datos.


Título: Re: Problema con sockets WinSock2
Publicado por: Riki_89D en 27 Septiembre 2011, 10:33 am
Hola,el servidor no me dja poner "Remote_Server.sin_addr = INADDR_ANY;"

me da error en donde esta el "="


ERROR:
error C2679: '=' binario : no se encontró un operador que adopte un operando en la parte derecha de tipo 'u_long'


Título: Re: Problema con sockets WinSock2
Publicado por: naderST en 27 Septiembre 2011, 19:52 pm
Disculpa es así:

Remote_Server.sin_addr.s_addr = INADDR_ANY;

O sino:

Remote_Server.sin_addr.S_un.S_addr = INADDR_ANY;