Autor
|
Tema: Problema con sockets WinSock2 (Leído 8,381 veces)
|
Riki_89D
Desconectado
Mensajes: 851
BCN CITY
|
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?
|
|
|
En línea
|
|
|
|
naderST
|
Que raro... si tienes algún servidor a la escucha en el puerto que te estás tratando de conectar debería funcionar.
|
|
|
En línea
|
|
|
|
Riki_89D
Desconectado
Mensajes: 851
BCN CITY
|
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?¿
|
|
|
En línea
|
|
|
|
naderST
|
El servidor lo hiciste tu? Si muestras algo de código sería mejor...
|
|
|
En línea
|
|
|
|
Riki_89D
Desconectado
Mensajes: 851
BCN CITY
|
Cliente: #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: #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
|
|
|
En línea
|
|
|
|
naderST
|
En el cliente nunca le asignas ningún contenido a la variable Buffer, de esta manera: Cliente: #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: #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.
|
|
|
En línea
|
|
|
|
Riki_89D
Desconectado
Mensajes: 851
BCN CITY
|
Hola,acabo de probar los codigo,pero no recibe nad ale servidor....:S se queda con la pantalla negra
|
|
|
En línea
|
|
|
|
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í: 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.
|
|
|
En línea
|
|
|
|
Riki_89D
Desconectado
Mensajes: 851
BCN CITY
|
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'
|
|
|
En línea
|
|
|
|
naderST
|
Disculpa es así:
Remote_Server.sin_addr.s_addr = INADDR_ANY;
O sino:
Remote_Server.sin_addr.S_un.S_addr = INADDR_ANY;
|
|
|
En línea
|
|
|
|
|
|