Problema con sockets WinSock2

Iniciado por Riki_89D, 25 Septiembre 2011, 18:25 PM

0 Miembros y 1 Visitante están viendo este tema.

Riki_89D

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?

naderST

Que raro... si tienes algún servidor a la escucha en el puerto que te estás tratando de conectar debería funcionar.

Riki_89D

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?¿

naderST

El servidor lo hiciste tu? Si muestras algo de código sería mejor...

Riki_89D

Cliente:

Código (cpp) [Seleccionar]

#include "windows.h"
#include "iostream"
#pragma comment(lib,"ws2_32.lib")

#define PORT 9999

WSADATA wsa;
SOCKET Client;
int Conexion;
sockaddr_in Remote_Server;

int Error()
{
std::cout << "Error " << GetLastError() << std::endl;
getchar();
return 0;
}

int main(void)
{
    if(WSAStartup(MAKEWORD(2,0),&wsa) != 0)
{
Error();
}
   
Remote_Server.sin_family = AF_INET;
Remote_Server.sin_port = htons(PORT);
Remote_Server.sin_addr = *((in_addr *)gethostbyname("localhost")->h_addr);

Client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

Conexion = connect(Client,(sockaddr *)&Remote_Server,sizeof(sockaddr));

if(Conexion == INVALID_SOCKET)
{
Error();
}

char *Buffer = (char*)malloc(5);
send(Client,Buffer,strlen(Buffer),0);
free(Buffer);

return 0;
}



Servidor:
Código (cpp) [Seleccionar]

#include "windows.h"
#include "iostream"
#pragma comment(lib,"ws2_32.lib")

#define PORT 9999

WSADATA wsa;
SOCKET Client;
int Conexion;
sockaddr_in Remote_Server;

int Error()
{
std::cout << "Error " << GetLastError() << std::endl;
getchar();
return 0;
}

int main(void)
{
    if(WSAStartup(MAKEWORD(2,0),&wsa) != 0)
{
Error();
}
   
Remote_Server.sin_family = AF_INET;
Remote_Server.sin_port = htons(PORT);
Remote_Server.sin_addr = *((in_addr *)gethostbyname("localhost")->h_addr);

Client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

Conexion = bind(Client,(SOCKADDR*)&Remote_Server,sizeof(Remote_Server));
listen(Client,10);
accept(Client,NULL,NULL);
char *Buffer = (char*)malloc(5);
while(true)
{

recv(Client,Buffer,strlen(Buffer),0);
if(strcmp(Buffer,"Hola"))
{
break;
}

}
std::cout << Buffer <<std::endl;
getchar();
free(Buffer);
return 0;
}


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

naderST

En el cliente nunca le asignas ningún contenido a la variable Buffer, de esta manera:

Cliente:
Código (cpp) [Seleccionar]

#include "windows.h"
#include "iostream"
#pragma comment(lib,"ws2_32.lib")

#define PORT 9999

WSADATA wsa;
SOCKET Client;
int Conexion;
sockaddr_in Remote_Server;

int Error()
{
std::cout << "Error " << GetLastError() << std::endl;
getchar();
return 0;
}

int main(void)
{
    if(WSAStartup(MAKEWORD(2,0),&wsa) != 0)
{
Error();
}

Remote_Server.sin_family = AF_INET;
Remote_Server.sin_port = htons(PORT);
Remote_Server.sin_addr = *((in_addr *)gethostbyname("localhost")->h_addr);

Client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

Conexion = connect(Client,(sockaddr *)&Remote_Server,sizeof(sockaddr));

if(Conexion == INVALID_SOCKET)
{
Error();
}

char buffer[] = "Hola";
send(Client,buffer,strlen(buffer),0);

return 0;
}


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

Servidor:
Código (cpp) [Seleccionar]
#include "windows.h"
#include "iostream"
#pragma comment(lib,"ws2_32.lib")

#define PORT 9999

WSADATA wsa;
SOCKET Client;
int Conexion;
sockaddr_in Remote_Server;

int Error()
{
std::cout << "Error " << GetLastError() << std::endl;
getchar();
return 0;
}

int main(void)
{
    if(WSAStartup(MAKEWORD(2,0),&wsa) != 0)
{
Error();
}

Remote_Server.sin_family = AF_INET;
Remote_Server.sin_port = htons(PORT);
Remote_Server.sin_addr = *((in_addr *)gethostbyname("localhost")->h_addr);

Client = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

Conexion = bind(Client,(SOCKADDR*)&Remote_Server,sizeof(Remote_Server));
listen(Client,10);
accept(Client,NULL,NULL);
char *Buffer = (char*)malloc(5);
while(true)
{

memset(Buffer, 0, 5);
recv(Client,Buffer,4,0);
if(!strcmp(Buffer,"Hola"))
{
break;
}

}
std::cout << Buffer <<std::endl;
getchar();
free(Buffer);
return 0;
}


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

Riki_89D

Hola,acabo de probar los codigo,pero no recibe nad ale servidor....:S se queda con la pantalla negra

naderST

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 (cpp) [Seleccionar]

SOCKET nueva_conex;
do{
nueva_conex = accept(Client, NULL,NULL);
}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.

Riki_89D

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'

naderST

Disculpa es así:

Remote_Server.sin_addr.s_addr = INADDR_ANY;

O sino:

Remote_Server.sin_addr.S_un.S_addr = INADDR_ANY;