J'ai un client Winsock2 TCP très simple - liste complète ci-dessous - qui blast un nombre d'octets. Cependant, il fonctionne très lentement sur le réseau; les données passent juste par.Débit de débogage des performances de l'application Winsock2 minimale
Voici ce que j'ai essayé et trouvé (à la fois les PC Windows sont sur le même réseau local):
- L'exécution de cette application d'une machine à l'autre est lente - il faut ~ 50 ans pour envoyer 8MB.
- Deux serveurs différents - netcat et un serveur personnalisé (aussi simple que le client ci-dessous) - ont donné les mêmes résultats. Taskmgr montre à la fois l'UC et le réseau qui sont à peine utilisés.
- Exécution de cette application avec le serveur sur la même machine est rapide - il faut ~ 1-2s pour envoyer 8MB.
- Un client différent, Netcat, fonctionne très bien - il faut ~ 7s pour envoyer 20 Mo de données. (J'ai utilisé le nc qui vient avec Cygwin.)
- La variation de la taille de la mémoire tampon (1 * 4096, 16 * 4096 et 128 * 4096) fait peu de différence.
- Exécution presque le même code sur les boîtes Linux sur un réseau local différent a très bien fonctionné. L'ajout d'une série d'instructions d'impression autour de l'appel
send
montre que nous passons la majeure partie de notre temps à y faire obstacle. Sur le côté serveur, nous voyons une série de blocs de réception de < = 4K (indépendamment de la taille des tampons que l'expéditeur pousse). Cependant, cela arrive aussi avec d'autres clients, comme netcat, qui tourne à plein régime.
Des idées? Merci d'avance pour des conseils.
#include <winsock2.h>
#include <iostream>
using namespace std;
enum { bytecount = 8388608 };
enum { bufsz = 16*4096 };
int main(int argc, TCHAR* argv[])
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
struct sockaddr_in sa;
memset(&sa, 0, sizeof sa);
sa.sin_family = AF_INET;
sa.sin_port = htons(9898);
sa.sin_addr.s_addr = inet_addr("157.54.144.70");
if (sa.sin_addr.s_addr == -1) {
cerr << "inet_addr: " << WSAGetLastError() << endl;
return 1;
}
char *blob = new char[bufsz];
for (int i = 0; i < bufsz; ++i) blob[i] = (char) i;
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (s == INVALID_SOCKET) {
cerr << "socket: " << WSAGetLastError() << endl;
return 1;
}
int res = connect(s, reinterpret_cast<sockaddr*>(&sa), sizeof sa);
if (res != 0) {
cerr << "connect: " << WSAGetLastError() << endl;
return 1;
}
int sent;
for (int j = 0; j < bytecount; j += sent) {
sent = send(s, blob, bufsz, 0);
if (sent < 0) {
cerr << "send: " << WSAGetLastError() << endl;
return 1;
}
}
closesocket(s);
return 0;
}
vous devez vérifier la carte réseau/NIC de la vitesse et du mode duplex, 10M/semi-duplex? Si ce n'est pas le cas, vérifiez le nombre de paquets d'erreurs affichés dans les statistiques NIC. ou pourriez-vous surveiller s'il y a beaucoup de diffusion sur le réseau local ou non? – Test
C'est 100M/full-duplex. netmon a montré beaucoup d'erreurs; voir ma réponse complète – Yang