c socket:send()一次只发送1个字节

时间:2016-09-13 14:49:09

标签: c sockets

我有以下程序,必须一次读取1MB的文件,将其发送到服务器(一次总是1MB)并获取哈希码:

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

其中Socket是指向包含套接字文件描述符和其他信息的结构的指针。

我试图在每次迭代时打印nsent,并且我发现套接字发送函数一次只发送1个字节,所以要传输1MB需要花费很多时间。

哪个可能是问题?

1 个答案:

答案 0 :(得分:1)

您将值1n的值)传递给Send buflen,因此它一次只发送一个字节。

如果n是兆字节数,则在调用函数时需要将此值乘以1048576:

Send(socket, buffer, n * 1048576);