Ich habe folgendes Programm, das eine Datei 1MB gleichzeitig lesen muss, es an einen Server senden (immer 1MB) und einen Hash zurückbekommen Code:c socket: send() sende nur 1 Byte gleichzeitig
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "Socket.h"
#include "../utils.h"
char *prog_name;
int main (int argc, char *argv[])
{
int fd, hash, n=atoi(argv[3]);
char buffer[1048576];
Socket socket=SCreate(TCP);
Connect(socket, argv[1], atoi(argv[2]));
fd=open(argv[4], O_RDONLY);
if(read(fd, buffer, 1048576)<1048576)
return 1;
while(n>0) {
Send(socket, buffer, n);
read(fd, buffer, 1048576);
n--;
}
RecvN(socket, &hash, 4);
printf("%d", ntohl(hash));
return 0;
}
Die Sendefunktion wie folgt definiert ist:
void Send(Socket socket, void *buffer, int buflen) {
int nleft, nsent;
for(nleft=buflen; nleft>0;) {
if((nsent=send(socket->sockfd, buffer, nleft, 0))<=0) {
perror("Send error");
exit(-1);
} else {
nleft-=nsent;
buffer+=nsent;
}
}
}
Wo Sockel ein Zeiger auf eine Struktur ist, die Socket-Dateideskriptor und andere Informationen enthält.
Ich habe versucht, NSent bei jeder Iteration zu drucken, und ich habe festgestellt, dass die Socket-Funktion send nur 1 Byte zu einer Zeit senden, so dass 1MB viel Zeit zu übertragen.
Welches kann das Problem sein?
Befehlszeile anzeigen, die Sie starten Programm verwenden. – Sergio
./a.out 127.0.0.1 1994 1 ../../tools/big_file.txt; also argv [1] ist die Server-IP, argv [2] ist der Server-Port, argv [3] ist die Anzahl der MB aus der Datei zu lesen und argv [4] ist der Dateiname –
'n = atoi (argv [3]) ', und dieses' n' geht an 'Send()' als 'buflen'. Ich schätze, du hast einfach vergessen, es zu '1024 * 1024' zu multiplizieren. – Sergio