Question

envoie les données une seule fois ce qui me semble irrationnelle comme il est dans une boucle:

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();
    }

}

devrait-il pas envoyer des données 10 fois? Je ne comprends pas. Voici tout le programme (il est assez court):

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");
}
Était-ce utile?

La solution

Avez-vous vérifié le code côté serveur. Client fait envoie dans une boucle, comment est le côté serveur qui les reçoit?

Edit: En ce qui concerne votre message . Si votre code de serveur ressemble à ceci, il ne recevra qu'une fois. Le serveur reçoit la connexion du client reçoit alors une fois puis attend à nouveau pour la connexion d'un client. Mais le client continue à envoyer dans une boucle. Sa juste une supposition que ceci est votre code serveur, je peux me tromper.

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;
  }
....................
....................
}

Autres conseils

-t-il passer par la boucle 10 fois, ou seulement passer par la boucle une fois?

Je ne suis pas familier avec la bibliothèque que vous utilisez, mais je ne voyais aucune sorte de commande flush. Si elle passe par la boucle 10 fois, mais envoie uniquement des données une fois, vous pourriez avoir besoin de rincer.

Client et la structure du serveur ne correspond pas.

Le client envoie 10 fois dans 1 connexion. Serveur accepte les connexions 10 et lit seulement 1 fois l'intérieur de chacun.

Il est évident que, chaque connexion est simmilar à un conteneur. Les données envoyées, mais pas lu après la fermeture d'une connexion est mis au rebut et (bien sûr) pas accessible à partir d'autres connexions.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top