UDT :: send in einer for-Schleife nur einmal sendet. Kein Fehler
-
26-09-2019 - |
Frage
Diese sendet Daten nur einmal die mich irrational scheint, wie es in einem for-Schleife ist:
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();
}
}
Sollte es nicht Daten 10-mal schicken? Ich verstehe es nicht. Hier ist das ganze Programm (es ist ziemlich kurz):
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");
}
Lösung
Haben Sie den Server-seitigen Code überprüft. Client tut in einem sendet for-Schleife, wie ist die Server-Seite, sie zu erhalten?
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;
}
....................
....................
}
Andere Tipps
geht es durch die Schleife 10-mal, oder geht nur durch die Schleife einmal?
Ich bin nicht vertraut mit der Bibliothek, die Sie verwenden, aber ich habe nicht jede Art von flush
Befehl sehen. Wenn es durch die Schleife 10 Mal geht aber nur Daten sendet einmal, Sie könnten zu spülen müssen.
Client und Serverstruktur stimmt nicht überein.
Client sendet 10-mal innerhalb 1-Verbindung. Server übernimmt 10 Verbindungen und liest nur 1 Mal innerhalb jedes einzelnen.
Offensichtlich jede Verbindung ist simmilar in einen Behälter. Daten gesendet, aber nicht lesen, nachdem eine Verbindung geschlossen wird verworfen und (natürlich) nicht auch von anderen Verbindungen.