2016-09-13 15 views
-1

私は以下のプログラムを持っています。一度に1MBのファイルを読み込み、それをサーバに送ります(常に1MBずつ)。コード:cソケット:send()一度に1バイトだけを送信する

#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; 
} 

送信機能は次のように定義される:ソケットは、ソケットファイルディスクリプタなどの情報を含む構造体へのポインタである

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; 
     } 
    } 
} 

私は各繰り返しでnsentを印刷しようとしましたが、ソケット送信機能は一度に1バイトしか送信しないので、1MBを転送するには多くの時間がかかります。

これは問題がありますか?

+0

を表示するコマンドラインを。 – Sergio

+0

./a.out 127.0.0.1 1994 1 ../../tools/big_file.txt;argv [1]はサーバのIPアドレス、argv [2]はサーバのポート、argv [3]はファイルから読み込むMBの数、argv [4]はファイル名 –

+2

'n = atoi(argv [3]) '、そして' n'は 'buflen'として' Send() 'に渡しています。私は '1024 * 1024'に複数の値を忘れてしまったと思います。 – Sergio

答えて

1

あなたはbuflenとしてSendに値1nの値)を渡し、それは、一度に1つのバイトを送信します。

nは、メガバイトの数であるならば、あなたは関数を呼び出すとき1048576で、この値を乗算する必要があります:あなたがプログラムを起動するために使用

Send(socket, buffer, n * 1048576); 
関連する問題