Domanda

Questo invia i dati solo una volta che sembra irrazionale per me come lo è in un ciclo for:

char* hello;
for (int i = 0; i < 10; i++) {

    hello = "Hello world!\n";
    if (UDT::ERROR == UDT::send(client, hello, strlen(hello) + 1, 0))
    {
        cout << "send: " << UDT::getlasterror().getErrorMessage();
    }

}

Non dovrebbe inviare dati 10 volte? Io non lo capisco. Ecco l'intero programma (è abbastanza breve):

int main()
{
    UDTSOCKET client;
    sockaddr_in serv_addr;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(9000);
    inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
    memset(&(serv_addr.sin_zero), '\0', 8);

    client = UDT::socket(AF_INET, SOCK_STREAM, 0);

    // connect to the server, implict bind
    if (UDT::ERROR == UDT::connect(client, (sockaddr*)&serv_addr, sizeof(serv_addr)))
    {
        cout << "connect: " << UDT::getlasterror().getErrorMessage();
    }

    char* hello;
    for (int i = 0; i < 10; i++) {

        hello = "Hello world!\n";

        if (UDT::ERROR == UDT::send(client, hello, strlen(hello) + 1, 0))
        {
            cout << "send: " << UDT::getlasterror().getErrorMessage();
        }

    }

    UDT::close(client);

    system("pause");
}
È stato utile?

Soluzione

Hai controllato il codice lato server. Client sta facendo manda in un ciclo for, come è il lato server che li riceve?

Modifica: In riferimento al tuo post qui . Se il codice del server simile a questo, si riceverà solo una volta. Il server è sempre la connessione dal client riceve quindi una volta poi di nuovo in attesa per la connessione da un client. Ma il cliente continua a spedire in un ciclo. Il suo solo una supposizione che questo è il vostro codice del server, potrei sbagliarmi.

while (true)
{
  UDTSOCKET recver = UDT::accept(serv, (sockaddr*)&their_addr, &namelen);

  cout << "new connection: " << inet_ntoa(their_addr.sin_addr) << ":" << ntohs(their_addr.sin_port) << endl;

  if (UDT::ERROR == UDT::recv(recver, data, 100, 0))
  {
    cout << "recv:" << UDT::getlasterror().getErrorMessage() << endl;
    //return 0;
  }
....................
....................
}

Altri suggerimenti

lo fa passare attraverso il ciclo 10 volte, oppure solo passare attraverso il ciclo una volta?

Non ho familiarità con la libreria che si sta utilizzando, ma non ho visto alcun tipo di comando flush. Se si passa attraverso il ciclo 10 volte, ma invia solo dati una volta, potrebbe essere necessario a filo.

Client e server struttura non corrisponde.

Il client invia 10 volte all'interno 1 collegamento. Server accetta le connessioni 10 e legge solo 1 volta all'interno di ciascuno di essi.

Ovviamente, ogni connessione è simmilar ad un contenitore. I dati inviati ma non legge, dopo la chiusura di una connessione viene scartata e (ovviamente) non è accessibile da altre connessioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top