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)
.