recv



  • Hallo,
    wie macht man es mit "int recv(socket,buffer,length,flag)" wenn man Daten empfangen will, aber nicht weiss wie groß?
    PS: 1) recv ist eine blocking Methode=>keine Daten: blocked
    2) recv bekommt max. buffer-groß Daten

    Grüße



  • ich habe es mit select probiert, und hier sind Abschnitte(ich lese von siteSocket)

    recv(siteSocket,recvData,MAX_DATA_SIZE-1, 0);
    fd_set readfds;
    FD_ZERO(&readfds);
    FD_SET(siteSocket, &readfds);
    struct timeval tv = {4, 0};
    int fdselect = select(siteSocket+1,&readfds,NULL,NULL,&tv);
    int isset = FD_ISSET(siteSocket, &readfds);
    while(isset) {
         recvBytesRemPro = recv(siteSocket,recvData,MAX_DATA_SIZE-1, 0);
        Console::WriteLine(S"I am in the if! {0}", fdselect.ToString());
        FD_ZERO(&readfds);
        FD_SET(siteSocket, &readfds);
        select(0,&readfds,NULL,NULL,&tv);
        isset = FD_ISSET(siteSocket, &readfds);
    }
    Console::WriteLine(S"I am outside the if!");
    

    dadrin ist keine Funktionalität, das ist nur zum Testen, aber er loopt bis unendlich, obwohl ich sicher bin, dass es soviel Data zum Empfang nicht gibt.
    Stimmt etwas denn nicht??



  • int rc=0;
    while( (rc = recv(siteSocket,recvData,sizeof(recvData)-1,0)) > 0)
    {
       recvData[rc] = '\0';
       cout << recvData;
    };
    

    So ungefähr sollte es aussehen... wenn nichts mehr kommt ists zuende sonst empfängt das Programm einfach weiter...



  • Original erstellt von particle:
    **```cpp
    int rc=0;
    while( (rc = recv(siteSocket,recvData,sizeof(recvData)-1,0)) > 0)
    {
    recvData[rc] = '\0';
    cout << recvData;
    };

    aber recv ist blockierend, und wenn nichts zu empfangen ist, dann liefert sie nicht 0, sondern wartet solange, bis etwas neues ankommt, oder ?



  • Nein, bei Non-Blocking Sockets gibt es -1 zurück (=SOCKET_ERROR mit Erweiterung WSAEWOULDBLOCK) und ist somit kleiner als 0, was in der while()-Schleife ja abgefangen wird....


Anmelden zum Antworten