13. maj 2003 - 20:54Der er
3 kommentarer og 1 løsning
recv hænger
Hejsa
Jeg 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.
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);
Jeg har nu fået mine sockets til at køre non-blocking ved at flytte rundt på lidt kode. Det viste sig i min server, at jeg kom til at køre ioctlsocket() før jeg havde initialiseret den socket jeg ville have min forbindelse på.
Jeg har nu et andet spørgsmål.
Når jeg kører non-blocking, hvordan kan jeg så se om min client får connected (altså på clienten)? Jeg har forsøgt noget at kalde select og se om der en socket klar at skrive på, men det virker ikke ordentligt. Her er min kode til det:
int Client::passiveOpen() { int nfds; // This is used for Compatibility fd_set conn; // Setup the read variable for the Select function timeval timeout; timeout.tv_sec = 0; // Set the timeout to 0 for Non Blocking timeout.tv_usec = 0; FD_ZERO(&conn); // Set the data in conn to nothing FD_SET(connectedSocket, &conn); // Tell it to get the data from the Listening Socket nfds = 1; int connector = -1;
// 0 = timeout >0 = number connected -1 = error while (connector <= 0) { // invalid argument - tjek select connect(connectedSocket, (struct sockaddr *)&connectedInfo, sizeof(connectedInfo)); connector = select(nfds, NULL, &conn, NULL, &timeout); // Is there any data coming in? WSAGetLastError(); Sleep(5000); }
Nu har jeg selv fundet ud af det. Jeg kunne bare flytte ioctlsocket() ned efter jeg connectede.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.