2016-09-13 3 views
-1

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?

+0

Befehlszeile anzeigen, die Sie starten Programm verwenden. – Sergio

+0

./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 –

+2

'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

Antwort

1

geben Sie den Wert 1 (der Wert von n) in Send als buflen, so sendet er nur ein Byte zu einem Zeitpunkt.

Wenn n die Anzahl der Megabyte ist, müssen Sie diesen Wert von 1048576 multiplizieren, wenn Sie die Funktion aufrufen:

Send(socket, buffer, n * 1048576); 
Verwandte Themen