- 论坛徽章:
- 0
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define PORT 4000
#define BUF_MAX 8192
#define SPILT_BUF 102400000
#define STEMP_BUF 102400
int main (int argc , char **argv)
{
unsigned long nfsize = 0;/*文件长度*/
int nspnum; /*分割数*/
int i,nmovsp,nfrnum;
int ncount = 0;
int sock_fd;
int pid;
int n = 0;
int ntranst,ntransf;
char szstname[1024];
char szstfname[1024];
char stempbuf[1024];
char szfrbuf[BUF_MAX];/*缓冲*/
FILE *fp,fpa;
struct hostent *se;
struct sockaddr_in sev_addr;
if(argc != 3)
{
printf("error: true input like spc <filename> IP \n" ;
exit(1);
}
if((se = gethostbyname(argv[2])) == NULL)
{
herror("input IP like: 159.156.1.192" ;
exit(1);
}
sev_addr.sin_family = AF_INET;
sev_addr.sin_port = htons(PORT);
sev_addr.sin_addr = *((struct in_addr *)se->h_addr);
bzero(&(sev_addr.sin_zero), ;
memset(szstname,0x00,sizeof(szstname));
memset(szstfname,0x00,sizeof(szstfname));
if(argv[1] != NULL)
{
strcpy(szstfname, argv[1]);
if((strstr(szstfname, "/" ) != NULL)
{
for(i = strlen(szstfname); i>0; i--)
{
memcpy(szstname, szstfname + i + 1, strlen(szstfname) - i - 1);
printf("%s\n", szstfname);
break;
}
}
else
{
strcpy(szstname, szstfname);
}
}
else
{
printf("error: file name is null\n" ;
exit(1);
}
if((fp = fopen(argv[1], "rb" ) == NULL)
{
printf("[%s] is not found", argv[1]);
exit(1);
}
fseek(fp, 0, SEEK_END);
nfsize = ftell(fp);
rewind(fp);
fclose(fp);
printf("%s\n", nfsize);
if(nfsize == 0)
{
printf("[%s] is null", argv[1]);
}
else if(nfsize < SPILT_BUF)
{
printf("[%s] is small", argv[1]);
exit(1);
}
else if(nfsize % SPILT_BUF > 0)
{
nspnum = nfsize / SPILT_BUF + 1;
}
else
{
nspnum = nfsize / SPILT_BUF;
}
printf("%s\n", nspnum);
for(i = 0; i < nspnum; i ++)
{
if(!fork())
{
if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket failed" ;
exit(1);
}
if(connect(sock_fd, (struct sockaddr*)&sev_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect failed" ;
exit(1);
}
if(i == nspnum - 1)
{
ntransf = nfsize - (nspnum - 1) * SPILT_BUF;
if(ntransf == SPILT_BUF)
{
ntranst = SPILT_BUF / BUF_MAX;
}
else
{
if(ntransf < BUF_MAX)
{
ntranst = 1;
}
else if(ntransf % BUF_MAX > 0)
{
ntranst = ntransf / BUF_MAX + 1;
}
else
{
ntranst = ntransf / BUF_MAX;
}
}
}
else
{
ntransf = SPILT_BUF;
ntranst = SPILT_BUF / BUF_MAX;
}
memset(stempbuf, 0x00, sizeof(stempbuf));
sprintf(stempbuf, "%d|%d|%s_%d", ntranst, ntransf, szstname, i);
pid = getpid();
printf("spc_%d:%s\n", pid, stempbuf);
if(send(sock_fd, stempbuf, 1024, 0) == -1)
{
perror("send failed" ;
close(sock_fd);
exit(1);
}
nmovsp = i * SPILT_BUF;
if((fp = fopen(argv[1],"rb" ) == NULL )
{
printf("[%s] is open failed\n", argv[1]);
exit(1);
}
fseek(fp, nmovsp, SEEK_SET);
while(!feof(fp))
{
memset(szfrbuf, 0x00, sizeof(szfrbuf));
nfrnum = fread(szfrbuf, sizeof(char), BUF_MAX, fp);
if(send(sock_fd, szfrbuf, nfrnum, 0) == -1)
{
perror("send failed" ;
close(sock_fd);
exit(1);
}
ncount = ncount + nfrnum;
if(ncount == SPILT_BUF)
break;
}
fclose(fp);
memset(stempbuf, 0x00, sizeof(stempbuf));
if(recv(sock_fd, stempbuf, 1024, 0) == -1)
{
perror("recv failed");
exit(1);
}
printf("%s\n", stempbuf);
close(sock_fd);
return 0;
}
}
while(n < nspnum)
{
if(waitpid(-1, NULL, 0) > 0)
{
n ++;
}
}
return 0;
}
|
|