recv hænger
HejsaJeg er ved at implementere en protokol i C++(Borland C++ Builder) unders Windows, men støder på at min tråd stopper når den når til receive. Jeg har forsøgt at gøre min socket non-blocking, men det har ikke ændret noget, så jeg har formodentligt gjort det forkert.
Jeg smider lige noget af min kode, så må i endeligt sige til, hvis i kan se min fejl.
connectedSocket = socket(AF_INET, SOCK_STREAM, 0);
if(connectedSocket == INVALID_SOCKET)
{
printf("Socket creation failed");
}
serverIP = serverip;
connectedInfo.sin_port = htons(PORT); // client chooses a random port
connectedInfo.sin_family = AF_INET;
connectedInfo.sin_addr.s_addr = inet_addr(serverIP);//their address;
unsigned long blocking = 1;
if (ioctlsocket(connectedSocket, FIONBIO, &blocking) != 0)
{
//printf("Non-blocking not enabled!");
ShowMessage("Non-blocking not enabled!");
}
****************************************
herefter connectes der
int connector = connect(connectedSocket, (struct sockaddr *)&connectedInfo, sizeof(connectedInfo));
if (connector > -1)
{
Priority = tpNormal;
Resume();
}
return connector;
************************************************
tråden der startes, læser og sender på forbindelsen
while(true)//! Terminated)
{
// sending pendling data
if(! nextSent)
{ if(next != 0)
{
bytesSent = sendData(next, nextLength);
if( bytesSent == -1)
{
;//activeClose();
} else if( bytesSent == 0)
{
// connection was closed by other side
passiveClose();
} else if (bytesSent > 0)
{
// hvad med fejl eller en lukket forbindelse ???
while (bytesSent < nextLength)
{
bytesSent += sendRest(bytesSent);
}
nextSent = true;
}
}
}
bytesReceived = receiveData(recvBuffer, recvLength);
if( bytesReceived == -1)
{
;//activeClose();
} else if( bytesReceived == 0)
{
// connection was closed by other side
passiveClose();
}
else if (bytesReceived > 0)
{
copy2Buffer(bytesReceived);
check4APDU();
cleanBuffer();
APDU apdu(lastReceived, lastReceivedLength);
apdu.testPrint();
int temp = apdu.getSSN();
temp = apdu.getRSN();
temp = apdu.getFormat();
printf(apdu.getASDU());
}
}
Jeg har kun postet, det jeg fandt nødvendigt fra min kode, så det er altså kun små udpluk.
Wagner