socket c++ network-programming winsock2 recv

c++ - socket - recv() devuelve siempre 0



socket.recv python (1)

Tengo un problema con la función recv() que no puedo explicar: siempre devuelve 0. Tengo una aplicación cliente / servidor en la que el servidor simplemente tiene que recibir una cadena del cliente a través de Internet (PC diferente) .
No hay problemas de conectividad, y también traté de enviar una cadena de servidor a cliente: funcionó. Busco en el blog y lo que encontré, la función de socket recv () devolviendo datos con longitud como 0 , recv sin bloqueo devuelve 0 cuando se desconecta , Recv devuelve cero incorrectamente , no me ayudó a entender.

Aquí publico la clase de red: Network.h

class Network { WSADATA wsaData; WORD wVersionRequested; int Port; unsigned int byteReceived, byteSent; SOCKET listeningSocket, connectedSocket; SOCKADDR_IN serverAddr, senderInfo, clientAddr; int caddrlen; char buff[DIM]; string buffer; public: Network(); ~Network(); void Recv(); };


Network.c

void Network::Recv() { int n = recv(connectedSocket, buff, strlen(buff), 0); setByteReceived(n); buffer.assign(buff, n); cout << "Buffer is: " << buff << endl; if (byteReceived == 0) cout << "/tConnection closed" << endl; else if (byteReceived > 0) { cout << "/tByte received: " << byteReceived << endl; cout << getBuffer() << endl; } else { myFormatMessage(WSAGetLastError()); } }


El comportamiento al final es el siguiente: el cliente y el servidor están conectados, el servidor devuelve 0 desde recv (). Intenté también ejecutar ambos programas en la misma máquina. Gracias por tu ayuda.


Tienes:

void Network::Recv() { int n = recv(connectedSocket, buff, strlen(buff), 0); ...

Si strlen(buff) devuelve 0 (porque buff contiene un byte nulo en el índice 0), le pedirá a recv() que lea 0 bytes, por lo que devolverá 0 bytes. Deberías usar sizeof(buff) lugar de strlen(buff) .