2010-11-20 2 views
0

Cela envoie les données une seule fois qui me semble irrationnel comme il est dans une boucle:UDT :: envoie une boucle for n'envoie qu'une seule fois. Pas d'erreur

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 10 fois les données? 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"); 
} 

Répondre

1

Avez-vous vérifié le code côté serveur. Le client fait des envois dans une boucle for, comment le côté serveur les reçoit-il?

Editer: En référence à votre publication here. Si le code de votre serveur ressemble à ceci, il ne sera reçu qu'une seule fois. Le serveur obtient la connexion du client, puis reçoit une fois puis attend à nouveau la connexion d'un client. Mais le client continue d'envoyer une boucle. C'est juste une supposition que c'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; 
    } 
.................... 
.................... 
} 
+0

Le serveur reçoit une boucle while (true). –

+0

Ok. Le serveur était un peu buggé. Maintenant, cela semble fonctionner. –

1

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

Je ne connais pas la bibliothèque que vous utilisez, mais je n'ai pas vu de commande flush. S'il passe 10 fois dans la boucle mais n'envoie qu'une fois les données, vous devrez peut-être vider.

+0

Il traverse la boucle 10 fois. La documentation de la bibliothèque est ici: http://udt.sourceforge.net/udt4/index.htm. Comment devrais-je tirer la chasse d'eau? Je ne suis pas très bon avec C/C++. J'ai juste suivi quelques extraits de code de la documentation. –

+0

Comment déterminez-vous qu'il n'envoie qu'un seul message? Avez-vous surveillé avec wireshark? – nos

1

La structure du client et du serveur ne correspond pas.

Le client envoie 10 fois à l'intérieur d'une connexion. Le serveur accepte 10 connexions et ne lit qu'une seule fois à l'intérieur de chacune d'entre elles.

De toute évidence, chaque connexion est similaire à un conteneur. Les données envoyées mais non lues après la fermeture d'une connexion sont ignorées et (bien sûr) inaccessibles depuis d'autres connexions.