Programación General > C/C++
Problema con sockets
(1/1)
System@32:
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++ ---#include <iostream>#include <WinSock2.h>#include <ws2tcpip.h>#include <iphlpapi.h>#include <conio.h> #pragma comment(lib, "Ws2_32.lib") void main( int argc, char *argv[] ){ WSAData wsaData; SOCKET mSocket, acceptSocket; struct sockaddr_in service, remote; char sendbuf[1024] = "Hello! I'm server, sending some test data..."; char recvbuf[1024] = ""; int bytesSent = SOCKET_ERROR; int bytesRecv = SOCKET_ERROR; char exit = ''; if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0 ) { std::cout << "WSAStartup failed!" << std::endl; getch(); return; } if( (mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET ) { std::cout << "Error at socket(): " << WSAGetLastError() << std::endl; WSACleanup; getch(); return; } service.sin_family = AF_INET; service.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); service.sin_port = htons( 55555 ); if( (bind(mSocket, (SOCKADDR*) &service, sizeof(service))) == SOCKET_ERROR ) { std::cout << "Error at bind(): " << WSAGetLastError() << std::endl; closesocket( mSocket ); WSACleanup; getch(); return; } if( listen(mSocket, 1) == SOCKET_ERROR ) { std::cout << "Error at listen(): " << WSAGetLastError() << std::endl; closesocket( mSocket ); WSACleanup; getch(); return; } std::cout << "****************************************" << std::endl; std::cout << "* Server is ready. Waiting for client! *" << std::endl; std::cout << "****************************************" << std::endl << std::endl; acceptSocket = SOCKET_ERROR; while( acceptSocket == SOCKET_ERROR ) { acceptSocket = accept( mSocket, NULL, NULL ); } mSocket = acceptSocket; bytesRecv = recv( mSocket, recvbuf, strlen(recvbuf), 0 ); if( bytesRecv == SOCKET_ERROR ) { std::cout << "Error at recv(): " << WSAGetLastError() << std::endl; closesocket( mSocket ); WSACleanup; getch(); return; } printf( "Bytes received: %dn", bytesRecv ); printf( "Client: %sn", recvbuf ); system( "pause" ); closesocket( mSocket ); WSACleanup;}
Cliente
--- Código: C++ ---#include <iostream>#include <WinSock2.h>#include <ws2tcpip.h>#include <iphlpapi.h>#include <conio.h> #pragma comment(lib, "Ws2_32.lib") void main( int argc, char *argv[] ){ WSAData wsaData; SOCKET mSocket, acceptSocket; sockaddr_in service; char sendbuf[1024] = "Hello! I'm client, sending some test data..."; char recvbuf[1024] = ""; int bytesSent = SOCKET_ERROR; int bytesRecv = SOCKET_ERROR; if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0 ) { std::cout << "WSAStartup failed!" << std::endl; getch(); return; } if( (mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET ) { std::cout << "Error at socket(): " << WSAGetLastError() << std::endl; WSACleanup; getch(); return; } service.sin_family = AF_INET; service.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); service.sin_port = htons( 55555 ); if( (connect(mSocket, (SOCKADDR*) &service, sizeof(service))) == SOCKET_ERROR ) { std::cout << "Error at connect(): " << WSAGetLastError() << std::endl; closesocket( mSocket ); WSACleanup; getch(); return; } bytesSent = send( mSocket, sendbuf, strlen(sendbuf), 0 ); if( bytesSent == SOCKET_ERROR ) { std::cout << "Error at send(): " << WSAGetLastError() << std::endl; closesocket( mSocket ); WSACleanup; getch(); return; } printf( "Bytes sent: %dn", bytesSent ); system( "pause" ); closesocket( mSocket ); WSACleanup;}
Epa:
Buenas
--- Citar ---char recvbuf[1024] = "";
--- Fin de la cita ---
--- Citar ---bytesRecv = recv( mSocket, recvbuf, strlen(recvbuf), 0 );
--- Fin de la cita ---
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
m0skit0:
sizeof no strlen
System@32:
Hostia! Si que no me di cuenta de eso! Gracias.
Navegación
Ir a la versión completa