#ifndef WIN32
#include <netinet/in.h>
#include <sys/socket.h>
#else
#include <winsock.h>
#include <windows.h>
#endif
#include <sys/stat.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <fcntl.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#define max(a,b) ((a) > (b) ? (a) : (b))
#define SA struct sockaddr
#define MAXLINE 4096
int main(int argc,char **argv)
{
//定义变量
int from_fd;
int bytes_read,bytes_write;
char buffer[MAXLINE];
char dirdest[128];
char *ptr;
int sockfd;
struct sockaddr_in servaddr;
time_t begin,end;
int rc = 0;
//windows专用的初始化变量
#ifdef WIN32
WORD wVersionRequested;
WSADATA wsaData;
#endif
//运行环境校验
if (argc != 3)
{
printf("usage:first.out <IPaddress> filename\n\r");
exit(1);
}
//地址初始化
#ifndef WIN32
bzero(&servaddr,sizeof(servaddr));
#else
memset(&servaddr, '\0', sizeof(servaddr));
#endif
//server地址赋值与字节序转换
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5000);
#ifndef WIN32
if (inet_pton(AF_INET,argv[1],&servaddr.sin_addr) <= 0) //支持多种协议
{
printf("inet_pton error for %s\n\r",argv[1]);
exit(1);
}
#else
if((servaddr.sin_addr.s_addr = inet_addr(argv[1])) <= 0) //不支持多种协议
{
printf("inet_addr error for %s\n\r",argv[1]);
exit(1);
}
#endif
//windows socket通信必须要用特殊的初始化
#ifdef WIN32
wVersionRequested = MAKEWORD( 1, 1 );
rc = WSAStartup( wVersionRequested, &wsaData );
if ( rc != 0 )
{
printf("WSAStartup:初始化套接字失败,程序退出.");
strerror(errno);
exit(1);
}
#endif
//socket调用
if ( (sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
printf("socket error\n\r");
exit(1);
}
//connect调用
if (connect(sockfd,(SA *)&servaddr,sizeof(servaddr)) < 0)
{
printf("connetc error\n\r");
exit(1);
}
//打开读文件,获取文件描述符
if((from_fd = open(argv[2],O_RDONLY)) == -1)
{
fprintf(stderr,"Open %s Error:%s\n",argv[2],strerror(errno));
exit(1);
}
//计时开始
begin = time(NULL);
printf("%.24s\r\n",ctime(&begin));
// 以下代码是一个经典的拷贝文件的代码
while(bytes_read = read(from_fd,buffer,MAXLINE)) //外层循环
{
printf("ok::%s\n", buffer);
// 一个致命的错误发生了
if((bytes_read == -1)&&(errno != EINTR))
break; //退出外层循环
else if(bytes_read > 0)
{
ptr = buffer;
while(bytes_write = write(sockfd,ptr,bytes_read)) //内层循环
{
//一个致命错误发生了
if((bytes_write==-1)&&(errno!=EINTR))
break; //退出内层循环
//写完了所有读的字节
else if(bytes_write==bytes_read)
break; //退出内层循环
//只写了一部分,继续写
else if(bytes_write>0)
{
ptr += bytes_write;
bytes_read -= bytes_write;
}
}
//写的时候发生的致命错误
if(bytes_write==-1)
break; //退出外层循环
}
}
//计时结束,发送结束
end = time(NULL);
printf("%.24s\r\n",ctime(&end));
//关闭文件描述符,关闭套接字
close(from_fd);
close(sockfd);
WSACleanup();
//程序结束
return(1);
}
评论0