• Domingo 15 de Diciembre de 2024, 15:58

Autor Tema:  Problema con sockets  (Leído 1547 veces)

System@32

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Problema con sockets
« en: Miércoles 12 de Enero de 2011, 18:11 »
0
Hola!

He empezado a jugar con los sockets (cliente/servidor). No parece tan complicado xD. El cliente envía una cadena de texto y el servidor la tiene que recoger y mostrar por la pantalla. El problema es que el servidor nunca recoge el texto. No se si es problema del código o que. Desactive firewall, antivirus, etc.

Server
Código: C++
  1. #include <iostream>
  2. #include <WinSock2.h>
  3. #include <ws2tcpip.h>
  4. #include <iphlpapi.h>
  5. #include <conio.h>
  6.  
  7. #pragma comment(lib, "Ws2_32.lib")
  8.  
  9. void main( int argc, char *argv[] )
  10. {
  11.     WSAData wsaData;
  12.     SOCKET mSocket, acceptSocket;
  13.     struct sockaddr_in service, remote;
  14.  
  15.     char sendbuf[1024] = "Hello! I'm server, sending some test data...";
  16.     char recvbuf[1024] = "";
  17.  
  18.     int bytesSent = SOCKET_ERROR;
  19.     int bytesRecv = SOCKET_ERROR;
  20.  
  21.     char exit = '';
  22.  
  23.     if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0 )
  24.     {
  25.         std::cout << "WSAStartup failed!" << std::endl;
  26.         getch(); return;
  27.     }
  28.  
  29.     if( (mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET )
  30.     {
  31.         std::cout << "Error at socket(): " << WSAGetLastError() << std::endl;
  32.         WSACleanup; getch(); return;
  33.     }
  34.  
  35.     service.sin_family = AF_INET;
  36.     service.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  37.     service.sin_port = htons( 55555 );
  38.  
  39.     if( (bind(mSocket, (SOCKADDR*) &service, sizeof(service))) == SOCKET_ERROR )
  40.     {
  41.         std::cout << "Error at bind(): " << WSAGetLastError() << std::endl;
  42.         closesocket( mSocket ); WSACleanup; getch(); return;
  43.     }
  44.  
  45.     if( listen(mSocket, 1) == SOCKET_ERROR )
  46.     {
  47.         std::cout << "Error at listen(): " << WSAGetLastError() << std::endl;
  48.         closesocket( mSocket ); WSACleanup; getch(); return;
  49.     }
  50.  
  51.     std::cout << "****************************************" << std::endl;
  52.     std::cout << "* Server is ready. Waiting for client! *" << std::endl;
  53.     std::cout << "****************************************" << std::endl << std::endl;
  54.  
  55.     acceptSocket = SOCKET_ERROR;
  56.     while( acceptSocket == SOCKET_ERROR )
  57.     {
  58.         acceptSocket = accept( mSocket, NULL, NULL );
  59.     }
  60.     mSocket = acceptSocket;
  61.  
  62.     bytesRecv = recv( mSocket, recvbuf, strlen(recvbuf), 0 );
  63.     if( bytesRecv == SOCKET_ERROR )
  64.     {
  65.         std::cout << "Error at recv(): " << WSAGetLastError() << std::endl;
  66.         closesocket( mSocket ); WSACleanup; getch(); return;
  67.     }
  68.  
  69.     printf( "Bytes received: %dn", bytesRecv );
  70.     printf( "Client: %sn", recvbuf );
  71.     system( "pause" );
  72.  
  73.     closesocket( mSocket );
  74.     WSACleanup;
  75. }
  76.  

Cliente
Código: C++
  1. #include <iostream>
  2. #include <WinSock2.h>
  3. #include <ws2tcpip.h>
  4. #include <iphlpapi.h>
  5. #include <conio.h>
  6.  
  7. #pragma comment(lib, "Ws2_32.lib")
  8.  
  9. void main( int argc, char *argv[] )
  10. {
  11.     WSAData wsaData;
  12.     SOCKET mSocket, acceptSocket;
  13.     sockaddr_in service;
  14.  
  15.     char sendbuf[1024] = "Hello! I'm client, sending some test data...";
  16.     char recvbuf[1024] = "";
  17.  
  18.     int bytesSent = SOCKET_ERROR;
  19.     int bytesRecv = SOCKET_ERROR;
  20.  
  21.     if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0 )
  22.     {
  23.         std::cout << "WSAStartup failed!" << std::endl;
  24.         getch(); return;
  25.     }
  26.  
  27.     if( (mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET )
  28.     {
  29.         std::cout << "Error at socket(): " << WSAGetLastError() << std::endl;
  30.         WSACleanup; getch(); return;
  31.     }
  32.  
  33.     service.sin_family = AF_INET;
  34.     service.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
  35.     service.sin_port   = htons( 55555 );
  36.  
  37.     if( (connect(mSocket, (SOCKADDR*) &service, sizeof(service))) == SOCKET_ERROR )
  38.     {
  39.         std::cout << "Error at connect(): " << WSAGetLastError() << std::endl;
  40.         closesocket( mSocket ); WSACleanup; getch(); return;
  41.     }
  42.  
  43.     bytesSent = send( mSocket, sendbuf, strlen(sendbuf), 0 );
  44.     if( bytesSent == SOCKET_ERROR )
  45.     {
  46.         std::cout << "Error at send(): " << WSAGetLastError() << std::endl;
  47.         closesocket( mSocket ); WSACleanup; getch(); return;
  48.     }
  49.    
  50.     printf( "Bytes sent: %dn", bytesSent );
  51.     system( "pause" );
  52.  
  53.     closesocket( mSocket );
  54.     WSACleanup;
  55. }
  56.  

Epa

  • Miembro MUY activo
  • ***
  • Mensajes: 242
  • Nacionalidad: ar
    • Ver Perfil
Re: Problema con sockets
« Respuesta #1 en: Miércoles 12 de Enero de 2011, 19:08 »
0
Buenas

Citar
char recvbuf[1024] = "";

Citar
bytesRecv = recv( mSocket, recvbuf, strlen(recvbuf), 0 );

strlen(recvbuf) devuelve 0, por lo que estarias haciendo:

bytesRecv = recv( mSocket, recvbuf, 0, 0 );

Si le decis que el tamaño del buffer es 0 no va a guardar nada.


Saludos
The sweet smell of a great sorrow lies over the land.


m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con sockets
« Respuesta #2 en: Miércoles 12 de Enero de 2011, 19:19 »
0
sizeof no strlen

System@32

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Problema con sockets
« Respuesta #3 en: Jueves 13 de Enero de 2011, 07:44 »
0
Hostia! Si que no me di cuenta de eso! Gracias.