Avatar billede wagner Nybegynder
13. maj 2003 - 20:54 Der 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.

    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
Avatar billede mickni33 Nybegynder
14. maj 2003 - 09:39 #1
1) Virkede det uden tråd ?

2) har du husket disse tre?
    WORD wVersionRequested=MAKEWORD(1,1);
    WSADATA wsaData;
    WSAStartup(wVersionRequested, &wsaData);

3) Der må ikke bruges <<endl i programmet da det ellers går ned.
Avatar billede wagner Nybegynder
14. maj 2003 - 14:47 #2
1) Jeg prøvede ikke at køre non-blocking uden tråd, da det dengang ikke var et problem at vente på dataene.

2) ja jeg bruger:
    WSADATA WsaDat;
    if (WSAStartup(MAKEWORD(1,1), &WsaDat) != 0)
    {
        printf("WSA Initialization failed");
    }

3) jeg bruger kun printf()

Jeg har fundet ud af at min ioctlsocket() giver en fejl tilbage, som jeg nu skal have afkodet.
Avatar billede wagner Nybegynder
14. maj 2003 - 21:08 #3
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);
        }


        Priority = tpNormal;
        Resume();

          return connector;
}
Avatar billede wagner Nybegynder
15. maj 2003 - 16:44 #4
Nu har jeg selv fundet ud af det. Jeg kunne bare flytte ioctlsocket() ned efter jeg connectede.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester