下载器,就是一种网络工具,从网络中接收自己想要的数据。
下载器是一个网络客户端。它的下载流程无非就是客户端连接服务器端,然后
发送资源下载请求,服务器就开始传送数据回来,客户端接收数据。
一个简单的下载就这样完成了。
所有的网络应用程序都是从socket编程开始的。下载器同样就由最简单的
socket编程开始。
首先是两个程序,分别是socket的客户端和服务端。(在windows系统vc6.0编译)
服务器端:
#include
#include
#pragma comment(lib,"WS2_32.lib")
void main()
{
WSADATA wsd;
SOCKET server; //服务器socket
SOCKADDR_IN addrSrv;
char sendBuf[100];
char recvBuf[100];
SOCKADDR_IN addrClient;
SOCKET client; //连接的客户端socket
int len;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("start up failed!\n");
return ;
}
server=socket(AF_INET,SOCK_STREAM,0); //创建socket
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //设置地址
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); //设置端口号
bind(server,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //绑定
listen(server,5); //设置最多连接数
len=sizeof(SOCKADDR);
while(1)
{
client=accept(server,(SOCKADDR*)&addrClient,&len); //接收客户端连接
sprintf(sendBuf,"Welcome %s ",
inet_ntoa(addrClient.sin_addr));
send(client,sendBuf,strlen(sendBuf)+1,0); //发送信息客户端
recv(client,recvBuf,100,0); //接收客户端数据
printf("%s\n",recvBuf);
closesocket(client);
}
closesocket(client); //关闭连接
WSACleanup();
}
客户端:
#include
#include
#pragma comment(lib,"WS2_32.lib")
void main()
{
WSADATA wsd;
SOCKET sockClient; //客户端socket
SOCKADDR_IN addrSrv;
char recvBuf[100];
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("start up failed!\n");
return ;
}
sockClient=socket(AF_INET,SOCK_STREAM,0); //创建socket
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //连接服务器端
recv(sockClient,recvBuf,100,0); //接收服务器端数据
printf("%s\n",recvBuf);
send(sockClient,"hello world",strlen("hello world")+1,0); //向服务器端发送数据
closesocket(sockClient); //关闭连接
WSACleanup();
}
由两个程序大概的知道了socket编程的流程,也明白网络的东西终究就是send和recv。
以上两个程序只需要简单的改写,就可以实现简单的传送文件了。
将客户端发送的信息改为发送请求的文件名。
send(sockClient,filename,strlen(filename)+1,0);
服务器端接收到文件名:
recv(client,filename,100,0);
服务器端发送文件信息:
if((fp=fopen(filename,"rb"))==NULL)closesocket(client); //请求的文件不存在,则关闭连接
n=fread(sendBuf,1,100,fp);
while(n>0){
send(client,sendBuf,n,0); //发送文件客户端
n=fread(sendBuf,1,100,fp);
}
客户端则接收文件信息:
if((fp=fopen(filename,"wb"))==NULL)
{
return ;
}
while((ret=recv(sockClient,recvBuf,100,0))>0)
{
fwrite(recvBuf,1,ret,fp);
}
这样就可以在windows下用两个程序进行文件拷贝。
下载器是一个网络客户端。它的下载流程无非就是客户端连接服务器端,然后
发送资源下载请求,服务器就开始传送数据回来,客户端接收数据。
一个简单的下载就这样完成了。
所有的网络应用程序都是从socket编程开始的。下载器同样就由最简单的
socket编程开始。
首先是两个程序,分别是socket的客户端和服务端。(在windows系统vc6.0编译)
服务器端:
#include
#include
#pragma comment(lib,"WS2_32.lib")
void main()
{
WSADATA wsd;
SOCKET server; //服务器socket
SOCKADDR_IN addrSrv;
char sendBuf[100];
char recvBuf[100];
SOCKADDR_IN addrClient;
SOCKET client; //连接的客户端socket
int len;
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("start up failed!\n");
return ;
}
server=socket(AF_INET,SOCK_STREAM,0); //创建socket
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //设置地址
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000); //设置端口号
bind(server,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //绑定
listen(server,5); //设置最多连接数
len=sizeof(SOCKADDR);
while(1)
{
client=accept(server,(SOCKADDR*)&addrClient,&len); //接收客户端连接
sprintf(sendBuf,"Welcome %s ",
inet_ntoa(addrClient.sin_addr));
send(client,sendBuf,strlen(sendBuf)+1,0); //发送信息客户端
recv(client,recvBuf,100,0); //接收客户端数据
printf("%s\n",recvBuf);
closesocket(client);
}
closesocket(client); //关闭连接
WSACleanup();
}
客户端:
#include
#include
#pragma comment(lib,"WS2_32.lib")
void main()
{
WSADATA wsd;
SOCKET sockClient; //客户端socket
SOCKADDR_IN addrSrv;
char recvBuf[100];
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
printf("start up failed!\n");
return ;
}
sockClient=socket(AF_INET,SOCK_STREAM,0); //创建socket
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //连接服务器端
recv(sockClient,recvBuf,100,0); //接收服务器端数据
printf("%s\n",recvBuf);
send(sockClient,"hello world",strlen("hello world")+1,0); //向服务器端发送数据
closesocket(sockClient); //关闭连接
WSACleanup();
}
由两个程序大概的知道了socket编程的流程,也明白网络的东西终究就是send和recv。
以上两个程序只需要简单的改写,就可以实现简单的传送文件了。
将客户端发送的信息改为发送请求的文件名。
send(sockClient,filename,strlen(filename)+1,0);
服务器端接收到文件名:
recv(client,filename,100,0);
服务器端发送文件信息:
if((fp=fopen(filename,"rb"))==NULL)closesocket(client); //请求的文件不存在,则关闭连接
n=fread(sendBuf,1,100,fp);
while(n>0){
send(client,sendBuf,n,0); //发送文件客户端
n=fread(sendBuf,1,100,fp);
}
客户端则接收文件信息:
if((fp=fopen(filename,"wb"))==NULL)
{
return ;
}
while((ret=recv(sockClient,recvBuf,100,0))>0)
{
fwrite(recvBuf,1,ret,fp);
}
这样就可以在windows下用两个程序进行文件拷贝。