我有以下程序,必须一次读取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需要花费很多时间。
哪个可能是问题?
答案 0 :(得分:1)
您将值1
(n
的值)传递给Send
buflen
,因此它一次只发送一个字节。
如果n
是兆字节数,则在调用函数时需要将此值乘以1048576:
Send(socket, buffer, n * 1048576);