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.
El compilador de Visual Studio es distinto al de CodeBlocks, revisa que no te esten faltando librerías.
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 =)
man strerror
oPen sYlar he provado con strerror y devuelve la cadena de "result too large"...
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;
}