Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ApOkAlizE en 7 Octubre 2012, 02:36 am



Título: ¿Ayuda con sockets C++?
Publicado por: ApOkAlizE en 7 Octubre 2012, 02:36 am
Bueno lo que me sucede es que estoy haciendo una programa usando C++ en CODE::BLOCKS, pues bueno, ya hice hace medio año uno tamién en C++ pero usando visual studio 2010 y ese funcionava, pero comparo el codigo con el que estoy haciendo ahora y esta todo igual, todo y eso en el siguiente codigo:
long reb;
char rebre[10001];
memset(rebre,0,10001);
int i = 2000;
setsockopt(Connectar,SOL_SOCKET,SO_RCVTIMEO,(const char *)&i,sizeof(i));
reb = recv(Connectar, rebre,10001 ,0);
if(reb == -1)
{
     //MENSAJE DE ALERTA
}
pues para ser exactos ni siquiera espera los 2 segundos para recibir datos y siempre entra en el if de -1 o sea error... pero la conexion se abre y realmente por ejemplo los send si que se envian(lo he comprovado por telnet)... ¿Alguien tiene alguna idea de que puede estar pasando?
Gracias de antemano.


Título: Re: ¿Ayuda con sockets C++?
Publicado por: Anvil en 7 Octubre 2012, 04:35 am
El compilador de Visual Studio es distinto al de CodeBlocks, revisa que no te esten faltando librerías.


Título: Re: ¿Ayuda con sockets C++?
Publicado por: oPen syLar en 7 Octubre 2012, 06:09 am
Postea todo el código.. que mensaje de alerta te lanza.? Seguro que al setear las opciones de tu socket.. Tienes un socket valido.?

strerror es tu amigo =)

Código:
man strerror


Título: Re: ¿Ayuda con sockets C++?
Publicado por: ApOkAlizE en 8 Octubre 2012, 00:13 am
oPen sYlar he provado con strerror y devuelve la cadena de "result too large"...


Título: Re: ¿Ayuda con sockets C++?
Publicado por: ApOkAlizE en 8 Octubre 2012, 00:56 am
Aquí dejo el trozo de codigo correspondiente als sockets.
Y he linkeado al proyecto:
libwsock32.a
libws2_32.a
libwxmsw28u.a


SERVIDOR:

#define _WIN32_WINNT 0x501
#include "windows.h"
#include "winsock2.h"
#include "ws2tcpip.h"
#pragma comment(lib, "ws2_32.lib")



int main()
{
WSAData wsa;
        WORD Versio = MAKEWORD(2,1);
         WSAStartup(Versio, &wsa);
      SOCKET Escoltar = socket(AF_INET ,SOCK_STREAM , NULL);
      SOCKET Connectar = socket(AF_INET ,SOCK_STREAM , NULL);
      SOCKADDR_IN Servidor;
      Servidor.sin_addr.s_addr = inet_addr( "192.168.1.13" );
      Servidor.sin_family = AF_INET;
      Servidor.sin_port = htons(800);
      Tornemi:
        int Connectat;
        Connectat = 0;
      bind(Escoltar, (SOCKADDR*)&Servidor, sizeof(Servidor));
      listen(Escoltar, 10);
      int Tamany = sizeof(Servidor);
      while(true)
      {

         if(Connectar = accept(Escoltar,(SOCKADDR*)&Servidor,&Tamany))
         {
             if(WSAStartup(Versio, &wsa)==NO_ERROR)
                  {
             while(true)
             {


         long reb;
         long env;
         //char *rebre = new char(10002);
         char rebre[100];
         memset(rebre,0,99);
               int i = 2000;
               setsockopt(Connectar,SOL_SOCKET,SO_RCVTIMEO,(const char *)&i,sizeof(i));
            reb = recv(Connectar, rebre,sizeof(rebre) ,0);
            if(reb == -1)
            {
                                       //salta el codigo siempre aquí
                system("pause");
            }
                env = send( Connectar, "M5V", 4, NULL );
                if(strcmp(rebre,"MD5")==0)
                {
                    system("pause");
                }
            if(strlen(rebre) > 2)
            {
               // system("pause");
            }
            if(strlen(rebre) < 2)
            {
                Connectat++;
                if (Connectat == 5)
                {
                SD.Estat(0);
                goto Tornemi;
                }
            }
            if(reb == 0)
            {
                SD.Estat(0);
                goto Tornemi;
            }
            else
            {
                    SD.Estat(1);
            }
                    char *Obtingut;
                    Obtingut = SD.Llegir();

             if(strlen(Obtingut) > 0)
             {
                 //SD.Estat(1);
             send( Connectar, Obtingut, strlen(Obtingut), 0 );
             SD.Esborrar();
             }
             else
             {
              send(Connectar, "M5V",4 ,NULL);
             }
            if(strcmp(rebre,"M5V")==0)
            {
                SD.Estat(1);
                system("pause");
                    memset(rebre,0,10000);
               Connectat = 0;
            }
            else
            {
                send( Connectar, "M5V", 4, 0 );
                if(strcmp(rebre,"M5V")==1 && strcmp(rebre,"")==1)
                {

                }
            }

             }
         }
         }
      }
      return 0x0;



}


CLIENTE:

#define _WIN32_WINNT 0x501
#include <windows.h>
#include <winsock2.h>
#pragma comment( lib, "ws2_32.lib" )
#include "ws2tcpip.h"

 WSAData wsa;
   WORD Versio = MAKEWORD(2,1);
   WSAStartup(Versio, &wsa);
   SOCKADDR_IN Client;
   Client.sin_addr.s_addr = inet_addr("192.168.1.13");
   Client.sin_family = AF_INET;
   Client.sin_port = htons(800);
   SOCKET Connectar;
    int Connectat;
        Connectat = 0;
        while(true)
   {
   Connectar = socket(AF_INET, SOCK_STREAM, NULL);
      if(connect(Connectar,(SOCKADDR*) &Client, sizeof(Client)))
      {
         while(true)
         {
         long reb;
         long env;
         char rebre[100];
         memset(rebre,0,100);
               int i = 2000;
               setsockopt(Connectar,SOL_SOCKET,SO_RCVTIMEO,(const char *)&i,sizeof(i));
            reb = recv(Connectar, rebre,sizeof(rebre) ,0);
              env = send(Connectar, "M5V",4 ,NULL);
                if(reb == -1)
            {
                system("pause");
            }
            if(strlen(rebre) < 1)
            {
                //system("pause");
                Connectat++;
                if (Connectat == 5)
                {
                    //system("pause");
                    Connectat = 0;
                        break;
                }
            }
            if(strcmp(rebre,"M5V")==0)
            {
                system("pause");
                send(Connectar, "M5V",4 ,NULL);
                memset(rebre,0,10001);
                Connectat = 0;
            }
         }
      }

    }
      return 0x0;
}