下載器,就是一種網絡工具,從網絡中接收本身想要的數據。
下載器是一個網絡客戶端。它的下載流程無非就是客戶端鏈接服務器端,而後
發送資源下載請求,服務器就開始傳送數據回來,客戶端接收數據。
一個簡單的下載就這樣完成了。
全部的網絡應用程序都是從socket編程開始的。下載器一樣就由最簡單的
socket編程開始。
首先是兩個程序,分別是socket的客戶端和服務端。(在windows系統vc6.0編譯)
服務器端:
#include <Winsock2.h>
#include <stdio.h>
#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 <winsock2.h> #include <stdio.h> #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下用兩個程序進行文件拷貝。