Versand großer Daten per socket
Ich bin senden von großen Datenmengen (naja... 1Mb) über die Buchse, aber ich weiß nicht, warum die sende-Aktion blockiert das Programm und endet nie. Kleine sendet läuft perfekt und ich konnte nicht finden, wo ist das problem hier. Kann mir jemand helfen, bitte?
Vielen Dank im Voraus für jede Hilfe können Sie zur Verfügung stellen.
int liResult = 1;
int liConnection = 0;
int liSenderOption = 1;
struct addrinfo laiSenderAddrInfo;
struct addrinfo *laiResultSenderAddrInfo;
memset(&laiSenderAddrInfo,0,sizeof(laiSenderAddrInfo));
laiSenderAddrInfo.ai_socktype = SOCK_STREAM;
laiSenderAddrInfo.ai_flags = AI_PASSIVE;
liResult = getaddrinfo(_sIp.c_str(), _sPort.c_str(), &laiSenderAddrInfo, &laiResultSenderAddrInfo);
if (liResult > -1)
{
liConnection = socket(laiResultSenderAddrInfo->ai_family, SOCK_STREAM, laiResultSenderAddrInfo->ai_protocol);
liResult = liConnection;
if (liConnection > -1)
{
setsockopt(liConnection, SOL_SOCKET, SO_REUSEADDR, &liSenderOption, sizeof(liSenderOption));
liResult = connect(liConnection, laiResultSenderAddrInfo->ai_addr, laiResultSenderAddrInfo->ai_addrlen);
}
}
size_t lBufferSize = psText->length();
long lBytesSent = 1;
unsigned long lSummedBytesSent = 0;
while (lSummedBytesSent < lBufferSize and lBytesSent > 0)
{
lBytesSent = send(liConnection, psText->c_str() + lSummedBytesSent, lBufferSize - lSummedBytesSent, MSG_NOSIGNAL);
if (lBytesSent > 0)
{
lSummedBytesSent += lBytesSent;
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überprüfen Sie die Puffer-Größe, Sie können dies tun, indem Sie diese Antwort
Wie finden Sie die socket-buffer Größe von linux
In meinem Fall, die Werte sind
Können Sie zwicken die Werte
net.core.rmem_max
undnet.core.wmem_max
im/etc/sysctl.conf
zur Erhöhung der socket-buffer Größe und laden mitsysctl -p
.Quelle: http://www.runningunix.com/2008/02/increasing-socket-buffer-size-in-linux/
Den
send()
Aufruf blockiert, bis alle Daten gesendet wurden oder gepuffert werden. Wenn das Programm am anderen Ende der socket nicht Lesen und somit gibt es keine Strömung von Daten, die write-buffer an Ihrem Ende füllt sich, undsend()
blockiert werden. Die Chancen sind, dass, wenn Sie versucht zu senden, eine kleinere Menge von Daten, die es passen in den Puffer.Siehe auch diese Antwort.
Für TCP, der kernel hat eine Feste Größe der Puffer in dem Speicher ist nicht gesendeten Daten. Die Größe dieses Puffers ist die aktuelle Fenstergröße für die TCP-Sitzung. Sobald dieser Puffer voll ist, keine neuen schicken, gescheitert. Dies ist ein TCP-flow-control-Mechanismus, der verhindert, dass Sie versucht, Daten zu senden schneller als der Empfänger verarbeiten können die Daten, während gleichzeitig die Bereitstellung einer automatischen senden für verloren gegangene Daten. Die Standard-Fenster, die kleiner als 64 Kb beschränkt, sondern kann größer bei high-latency-Netzwerke hoher Bandbreite.
Was Sie wahrscheinlich tun müssen, ist, brechen die Daten in kleinere Blöcke senden und dann sicherzustellen, dass Sie einen flow-off-Mechanismus, wenn Ihre sende-Puffer voll ist.
accept()
undconnect()
beziehungsweise. Brechen die Daten in kleinere Blöcke senden wird, haben keine Auswirkungen auf dieses problem. Downvote.